思路:对输入的学生的解决问题数和用时进行排序;先排解觉问题的数目,再排用时;
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
struct node
{
int slove;
long time;
int order;
int mark;
}s[110];
bool cmp1(node a,node b)
{
return a.order<b.order;
}
bool cmp2(node a,node b)
{
if(a.slove!=b.slove)
{
return a.slove>b.slove;
}
else
{
return a.time<b.time;
}
}
int main(int argc, char *argv[]) {
int t;
int k;
int h,m,ss;
int i;
int sum1,sum2,sum3,sum4;
int p1,p2,p3,p4;
int x;
x=0;
while(scanf("%d",&t)!=EOF)
{
if(t<0)
break;
k=0;
sum1=sum2=sum3=sum4=0; //记录有多少个 同样成绩的人
p1=p2=p3=p4=0; //记录同样成绩的人已经有多少个
while(t--)
{
scanf("%d %d:%d:%d",&s[k].slove,&h,&m,&ss);
s[k].time=h*3600+m*60+ss;
s[k].order=k;
k++;
}
sort(s,s+k,cmp2); //按先解决的问题 数目,再解决的时间长短,进行排序;
for(i=0;i<k;i++) //找相同成绩的人数
{
if(s[i].slove==1)
sum1++;
if(s[i].slove==2)
sum2++;
if(s[i].slove==3)
sum3++;
if(s[i].slove==4)
sum4++;
}
for(i=0;i<k;i++) //为每个人赋成绩;
{
switch (s[i].slove)
{
case 0:
s[i].mark=50;
break;
case 1:
if(p1<sum1/2)
s[i].mark=65;
else
s[i].mark=60;
p1++;
break;
case 2:
if(p2<sum2/2)
s[i].mark=75;
else
s[i].mark=70;
p2++;
break;
case 3:
if(p3<sum3/2)
s[i].mark=85;
else
s[i].mark=80;
p3++;
break;
case 4:
if(p4<sum4/2)
s[i].mark=95;
else
s[i].mark=90;
p4++;
break;
case 5:
s[i].mark=100;
break;
}
}
sort(s,s+k,cmp1);
for(i=0;i<k;i++)
printf("%d\n",s[i].mark);
printf("\n");
}
return 0;
}