当前位置: 代码迷 >> 综合 >> PAT 甲级 1080 PAT Ranking 个人错误总结
  详细解决方案

PAT 甲级 1080 PAT Ranking 个人错误总结

热度:95   发布时间:2024-02-06 01:57:47.0

做这个题看题花了15分钟,做出来倒是没多久,检查point又花了好久。
我发现我的错误总是在下标上,这次是因为设定了一个多个数组存放被录取的id,但是后面检查这个数组位数不能通过这个id返回到原来结构体数组了,因为结构体的id不是下标,但是我想当然的认为是下标了。
还有一个就是输入为零的时候可能会导致越界,就在一个地方先添加一个if。
总结:读题的过程中,针对某些要求事先想好可能的坑,到最后查point可以试试过一遍自己的特殊案例。
下标问题自己注意,我这人巨喜欢下标套下标。。

#include<bits/stdc++.h>
using namespace std;
struct student{int id;int GE;int GI;int G;int w[5];//志愿 int rank;
}stu[40000];
int school[100];
bool cmp(student a,student b){if(a.G!=b.G) return a.G>b.G;else return a.GE>b.GE;
}
bool cmp2(int a,int b){return stu[a].id<stu[b].id;
}
//招生数 
int main(){int n,m,k;vector<int> q[100];scanf("%d %d %d",&n,&m,&k);for(int i=0;i<m;i++){scanf("%d",&school[i]);}for(int i=0;i<n;i++){scanf("%d %d",&stu[i].GE,&stu[i].GI);stu[i].G=stu[i].GE+stu[i].GI;stu[i].id=i;for(int j=0;j<k;j++){scanf("%d",&stu[i].w[j]);}}sort(stu,stu+n,cmp);if(n)stu[0].rank=1;for(int i=1;i<n;i++){if(stu[i].G==stu[i-1].G&&stu[i].GE==stu[i-1].GE){stu[i].rank=stu[i-1].rank;}else stu[i].rank=i+1;}
//printf("heher");for(int i=0;i<n;i++){for(int j=0;j<k;j++){int v=stu[i].w[j];if(school[v]!=0)if(q[v].size()<school[v]){q[v].push_back(i);break;}else if(stu[i].rank==stu[q[v][q[v].size()-1]].rank){q[v].push_back(i);break;}}}//printf("heher");for(int i=0;i<m;i++){sort(q[i].begin(),q[i].end(),cmp2);for(int j=0;j<q[i].size();j++){printf("%d",stu[q[i][j]].id);if(j!=q[i].size()-1)printf(" ");}printf("\n");}return 0;
}
  相关解决方案