题目1014:排名
/*
1.字符串必须要用strcpy()进行比较!!!别犯低级错误。。。。。
2.数组下标不是从0开始的话,要注意当有0个的情况,是否需要跳过,不然可能 会越界 或 产生错误结果。
*/
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int value[15]; //有10道考题,按题号存分值
const int MAX=1100;
struct E{
char no[25];//字符数组不超过20,至少设置为21。
int score;
}r[MAX];
bool cmp(E a,E b)
{
if(a.score!=b.score)
return a.score>b.score;
else
return strcmp(a.no,b.no)<0; //记住:字符串必须要用strcpy()进行比较!!!别犯低级错误。。。。。
}
int main()
{
int n,m,paScore,i,j,num,tmp,cnt;
//freopen("G:\\in.txt","r",stdin);
//freopen("G:\\our.txt","w",stdout);
while(scanf("%d",&n)!=EOF){
if(n==0) break;
scanf("%d %d",&m,&paScore);
for(i=1;i<=m;i++){ //从第一道题开始,不是第0道开始。
scanf("%d",&value[i]);
}
for(i=0;i<n;i++){
r[i].score=0;//初始化
scanf("%s%d",&r[i].no,&num); //当num为0时,最好加个判断条件if(num!=0)再执行下面的for循环以免越界。
for(j=0;j<num;j++){ //由于题号从1开始,value[0]没有被赋值默认为0,所以第0道题分值为0,加了白加,不判断也没错。
scanf("%d",&tmp);
r[i].score+=value[tmp];
}
}
sort(r,r+n,cmp);
cnt=0;
for(i=0;i<n;i++){
if(r[i].score>=paScore)
cnt++;
}
printf("%d\n",cnt);
if(cnt!=0){ //注意啦!!只有存在及格的情况下才会输出!!!
for(i=0;i<n;i++){
if(r[i].score>=paScore) // 注意此处是大于等于即及格。
printf("%s %d\n",r[i].no,r[i].score);
}
}
}
return 0;
}