半年前刚入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;  

 
 
posted on 2011-05-15 16:17  cchun  阅读(356)  评论(0编辑  收藏  举报