题目网站:
http://acm.hdu.edu.cn/showproblem.php?pid=1084
很多人说这是一道水题,但是我却步步维艰,这却是一道水题,却耗了我一天,如果你也被这道题所困扰,希望我的失败能给你提供一些帮助,首先理解一下题目的大义
:
老师要通过五道题给大家评分,做对5道题的,无论时间有多少,都可以得100分,而答对0道题的,无论时间多长都是50分,当你答对四道题,若你在先答对四道题的一半人中(若有3人答对,只能有一人,5人答对,只能有2人),恭喜你,你可获得95分,3.2.1道题以此类推
我之前给自己草稿的时候分成了四步
1.输入处理 :while(scanf " n "
!= EOF && n > 0 )
2.记录所用时间和排名 :a[i].time = h*3600 + m*60 +s;
a[i].rank = ++max[a.problem];
3.冒泡排序rank
4.输出 switch(输出项有多项)
结果是消耗我一天都是WA(wrong anser),原因就是在排序上,我原本以为,如果a用时大于b,且a排名小于b;就交换排名。但不管怎么交换都是徒劳无功的,因为我比较的是时间,交换的是排名!!!最后为了整体的代码,取消了排序,改成了++,果然皇天不负有心人,T . T Aceppted
#include<stdio.h>
typedef struct Student
{
int time;//用来存储所花的总时间
int problem;//答对的问题数
int rank;//按时间多少的排名
} student;
int main()
{
int n,h,m,s;//时分秒
while(scanf("%d",&n) != EOF && n > 0)
{
student a[105];
int max[6] = {0};//做对1~5题的人数各有多少
for(int i = 0; i < n; i++)//输入
{
scanf("%d%d:%d:%d",&a[i].problem, &h, &m, &s);
a[i].time = h*3600 + m*60 + s;//便于比较
max[a[i].problem]++;
a[i].rank = 1;//所有排名为1,为后面加做铺垫
}
for(int i = 0; i < n; i++)
for(int j = i + 1; j < n; j++)
{
if(a[i].problem == a[j].problem)//如果两人答对的问题一样,则进行如下操作
{
if(a[i].time > a[j].time) a[i].rank ++;
else a[j].rank++;//如果我用时比你多,我rank++,否则你rank++
}
}
for(int i = 0; i < n; i++)//输出
switch (a[i].problem){
case 5 : printf("%d/n",100); break;
case 4 :if(a[i].rank > max[4]/2) printf("%d/n",90);
else printf("%d/n",95); break;
case 3 :if(a[i].rank > max[3]/2) printf("%d/n",80);
else printf("%d/n",85); break;
case 2 :if(a[i].rank > max[2]/2) printf("%d/n",70);
else printf("%d/n",75); break;
case 1 :if(a[i].rank > max[1]/2) printf("%d/n",60);
else printf("%d/n",65); break;
case 0 : printf("%d/n",50); break;
}
printf("/n");
}
return 0;
}