题目:
1080 Graduate Admission - PAT (Advanced Level) Practice (pintia.cn)
测试点4出现段错误,其他过了,找不出来哪里有问题。准备把别人代码复现一遍。
其他:
1、排序函数要用 & 引用传参,不然会超时
```
在排序函数中使用引用传递可以避免不必要的对象拷贝,从而提高排序的效率。如果没有使用引用传递,那么每次传递参数时都会复制一份对象,这在数据量较大时会增加额外的开销,导致排序速度变慢,甚至在数据量较大时可能会导致超时。使用引用传递可以直接操作原始对象,而不是复制对象,因此可以提高效率。特别是在排序函数中,可能需要频繁地进行元素的交换或比较,如果每次都复制对象,会增加额外的开销,影响排序的性能。
因此,在排序函数中,应该使用引用传递参数,以避免不必要的性能损失。
```
2、有博主猜测测试点四是所有数据都一样
PAT 甲 1080 测试点4_pat 1080检测点-CSDN博客
他的测试数据我能通过
11 6 3 2 1 2 2 2 3 100 100 0 1 2 100 100 2 3 5 100 100 0 3 4 100 100 1 2 0 100 100 5 1 3 100 100 1 0 2 100 100 0 1 2 100 100 0 1 2 100 100 1 3 2 100 100 1 2 3 100 100 0 2 43、我注释掉的这段代码会让输出为空,可能是出现了越界问题?没搞懂哪里出了问题,待解决。
/*int num[110]={0},res[110]={0}; int ss_id[110][40010];*/
完整:
#include <iostream> #include <cstdio> #include <vector> #include <algorithm> using namespace std; struct stu{ int c[5]; int GE,GI; int rank,id; int sum=0;//与sum/2的排名一致 }; int cmp1(stu& a,stu& b){ if(a.sum!=b.sum) return a.sum>b.sum; else return a.GE>b.GE; } int cmp2(int& a,int& b){ return a<b; } int main(){ int n,m,k; int i,j; /*int num[110]={0},res[110]={0}; int ss_id[110][40010];*/ if(scanf("%d %d %d",&n,&m,&k)==EOF) printf("error"); int num[m]={0},res[m]={0}; int ss_id[m+1][40001]; for(i=0;i<m;i++){ if(scanf("%d",&num[i])==EOF) printf("error"); } for(int i=0;i<m+1;i++){ for(j=0;j<40000;j++) ss_id[i][j]=-1;//录取学生编号可能为0,故记录初始化为-1 } vector<stu> vt(n); for(i=0;i<n;i++){ if(scanf("%d %d",&vt[i].GE,&vt[i].GI)==EOF) printf("error"); vt[i].sum=vt[i].GE+vt[i].GI; vt[i].id=i; for(j=0;j<k;j++){ if(scanf("%d",&vt[i].c[j])==EOF) printf("error"); } } sort(vt.begin(),vt.end(),cmp1); vt[0].rank=1; for(i=1;i<n;i++){ if(vt[i].sum==vt[i-1].sum&&vt[i].GE==vt[i-1].GE) vt[i].rank=vt[i-1].rank; else vt[i].rank=i+1; } for(i=0;i<n;i++){ for(j=0;j<k;j++){ if(res[vt[i].c[j]]<num[vt[i].c[j]]){ ss_id[vt[i].c[j]][res[vt[i].c[j]]++]=i;//选择存编号而不是id break;//不用再看后面志愿 }else if(res[vt[i].c[j]]>=num[vt[i].c[j]]){//满名额看并列 int last=ss_id[vt[i].c[j]][num[vt[i].c[j]]-1];//注意列坐标-1 if(vt[i].rank==vt[last].rank){ ss_id[vt[i].c[j]][res[vt[i].c[j]]++]=i; break;//不用再看后面志愿 }else{ continue;//看下个志愿 } } }//for j } for(i=0;i<m;i++){ if(res[i]==0) printf("\n"); else{ vector<int> temp; for(j=0;ss_id[i][j]!=-1;j++){ temp.push_back(vt[ss_id[i][j]].id);//输出编号 } sort(temp.begin(),temp.end(),cmp2); for(j=0;j<(int)temp.size();j++){ if(j==0) printf("%d",temp[j]); else printf(" %d",temp[j]); } printf("\n"); //temp.clear(); } } return 0; }
标签:1025,Ranking,PAT,int,sum,vt,100,id From: https://www.cnblogs.com/melusine/p/18019429