PAT1025
这道题是照着晴神的来敲,但是自己技术太渣,中间还是出现了不少问题。
1.学习到排序的做法,利用algorithm库的sort(begin,end,cmp),自己按照题目要求来完成cmp的编写
可能经常会用到cstring库的strcmp(a,b),是个好东西,a>b返回正数,==返回0,小于返回负数
2.如果排序题中的个体是有很多用于排序的私人信息的话,可以使用struct来囊括
#include<iostream> #include<stdio.h> #include<cstring> #include<algorithm> using namespace std; struct student{ char rn[15]; //准考号 int score; //分数 int ln; //场次号 int lr; //本场排名 }; student stu[30001]; bool cmp(const student &a,const student &b){ if(a.score!=b.score) return a.score>b.score; else return strcmp(a.rn,b.rn)<0; //准考号小的排在前面 } int main(){ freopen("in.txt","r",stdin); int n,num=0; //n为考场的数量,num为总人数 scanf("%d",&n); for(int i=1;i!=n+1;++i){ int k; //本场人数 scanf("%d",&k); for(int j=0;j!=k;++j){ scanf("%s %d",stu[num].rn,&stu[num].score); stu[num].ln=i; num++; } sort(stu+num-k,stu+num,cmp); //当前场次排序 stu[num-k].lr= 1; for(int j=1;j!=k;j++){ if(stu[num-k+j].score==stu[num-k+j-1].score) stu[num-k+j].lr=stu[num-k+j-1].lr; else stu[num-k+j].lr=j+1; } } printf("%d",num); sort(stu,stu+num,cmp); int r=1; for(int i=0;i!=num;i++){ printf("\n"); if(i!=0 && stu[i].score!=stu[i-1].score) r=i+1; printf("%s %d %d %d",stu[i].rn,r,stu[i].ln,stu[i].lr); } return 0; }