Problem Description 今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排序,没有考虑
Input 测试输入包含若干场考试的信息。每场考试信息的第1行给出考生人数N ( 0 < N
Output 对每场考试,首先在第1行输出不低于分数线的考生人数n,随后n行按分数从高
Sample Input 4 5 25 10 10 12 13 15 CS004 3 5 1 3 CS003 5 2 4 1 3 5 CS002 2 1 2 CS001 3 2 3 5 1 2 40 10 30 CS001 1 2 2 3 20 10 10 10 CS000000000000000001 0 CS000000000000000002 2 1 2 0
Sample Output 3 CS003 60 CS001 37 CS004 37 0 1 CS000000000000000002 20 |
AC码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int MAX=22;
const int MAXN=11;
int point[MAXN];
struct node{
char num[MAX];//准考证号
int por_num[MAXN];//做出来的题目
int pnt;//总得分
}s[1001];
bool cmp(node &x,node &y)
{
if(x.pnt ==y.pnt )//总得分相同时,按照考号升序
return strcmp(x.num ,y.num )<0?1:2;
else
return x.pnt >y.pnt ;//总得分按照升序排序
}
int main()
{
int N,sum;
while(~scanf("%d",&N))
{//N名同学
sum=0;
if(N==0)
break;
int M,G;//M道题 G为分数线
scanf("%d %d",&M,&G);
int i,max;
for(i=0;i<M;i++)
scanf("%d",&point[i]); //每道题的满分情况
for(i=0;i<N;i++)
{
scanf("%s",s[i].num );//输入考生号
s[i].pnt =0;
int slv,j;
scanf("%d",&slv);//该考生答对的题目的数量
for(j=0;j<slv;j++)
{
scanf("%d",&s[i].por_num [j]);
s[i].pnt +=point[s[i].por_num [j]-1];
}
}
for(i=0;i<N;i++)
if(s[i].pnt >=G)
sum++;//超过分数线的总人数
printf("%d\n",sum);
sort(s,s+N,cmp);//按要求排序
for(i=0;i<sum;i++)//将超过分数线的学生信息输出
printf("%s %d\n",s[i].num ,s[i].pnt );
}
return 0;
}