半年前刚入ACM,看到这道题就傻眼,今天做,发现其实就是一道模拟题而已。完全就是那么直的思路。还是,很锻炼你的语言掌握程度哦。细节很多,大的方面不过就是开一个结构体,然后进行结构体排序罢了(结构体中排了三次序)。
思路神马的没啥好讲。只是最后的输出还是有点要注意的。输出的名字是左对齐,并且域宽为10,还有题数为2个域宽,耗时为4个域宽。并且两两之间有一个空格。这点我一开始没有注意到。
还有,其中的学生数是没有要求限制的,所以用EOF结束,在调试的时候用两次crtl+z就可以了。
附:题目要求的输出。
Output
将这些学生的考试现状,输出一个实时排名。实时排名显然先按AC题数的多少排,多的在前,再按时间分的多少排,少的在前,如果凑巧前两者都相等,则按名字的字典序排,小的在前。每个学生占一行,输出名字(10个字符宽),做出的题数(2个字符宽,右对齐)和时间分(4个字符宽,右对齐)。名字、题数和时间分相互之间有一个空格。
#include<iostream> #include<algorithm> using namespace std; struct people { char name[101]; int score[15]; int rnum; int ctime; }p[1005]; bool cmp(struct people a,struct people b)//结构体排序 { if(a.rnum>b.rnum) return true; else if(a.rnum==b.rnum) { if(a.ctime<b.ctime) return true; else if(a.ctime==b.ctime) { if(strcmp(a.name,b.name)<0) return true; else return false; } else return false; } else return false; } int main(void) { int n,m,temp,c,i; char ch; scanf("%d%d",&n,&m); c=1; while(scanf("%s",p[c].name)!=EOF) { p[c].rnum=0; p[c].ctime=0; for(i=1;i<=n;i++) { scanf("%d",&p[c].score[i]); if(p[c].score[i]>0) p[c].rnum++; //这里的p[i].score[i]是算这个人这一道题中所花的时间 if(scanf("%c",&ch)&&ch=='(')//注意,这一步判断有没有小括号。有的话,就将罚的时间一起算进p[i].score[i]中 { scanf("%d",&temp); scanf("%c",&ch); p[c].score[i]+=temp*m; } if(p[c].score[i]>0) p[c].ctime+=p[c].score[i];//用p[i].ctime汇总,算出一个人的总时间 } c++; // cout<<c<<endl; } sort(p+1,p+c,cmp);//sort排序 for(i=1;i<c;i++) printf("%-10s %2d %4d\n",p[i].name,p[i].rnum,p[i].ctime);//名字左对齐用"-1" return 0; } |