题意是:有N个人做5道题,给出做出题的个数和花费的总时间,做出5道题给100分,做出4道题给95或90,类推。如果有>=2个人做出题的数目一样,则取前n/2的人较多的分数,如有3个人做出4道题,则第一得95分,其他得90分。主要用的是sort函数。
AC代码如下:
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=101;
struct node{
int score;//学生的得分
int num;//学生做出的题目数目
char time[10];//花费的时间
}student[N];
bool cmp(node a,node b)
{
if(a.num==b.num)
return strcmp(a.time,b.time)<0;//当做出题目相等时,按时间由少到多排序
else
return a.num>b.num;//按题目数目由多到少排序
}
int s[6][2]={50,50,60,65,70,75,80,85,90,95,100,100};
int main()
{
int n,i,x[6];
char tmp[N][10];
while(scanf("%d",&n),n!=-1)
{
for(i=1;i<=n;i++)
{
scanf("%d%s",&student[i].num,student[i].time);
strcpy(tmp[i],student[i].time);//备个份,记录原顺序
}
sort(student+1,student+n+1,cmp);
memset(x,0,sizeof(x));//相同题目数,排名在n/2以前的数目
for(i=1;i<=n;i++)
{
switch(student[i].num)
{
case 4:x[4]++;break;
case 3:x[3]++;break;
case 2:x[2]++;break;
case 1:x[1]++;break;
default:break;
}
}
for(i=1;i<=4;i++)
if(x[i]!=1)x[i]/=2;
for(i=1;i<=n;i++)
{
if(x[student[i].num]>0){
student[i].score=s[student[i].num][1];
x[student[i].num]--;
}
else
student[i].score=s[student[i].num][0];
}
for(i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(strcmp(tmp[i],student[j].time)==0){
printf("%d\n",student[j].score);
break;
}
printf("\n");
}
return 0;
}