#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN = 100005;
const int INF = 0x7fffffff;
struct pp
{
char name[25];
int fen ;
} s[MAXN] ,s2[MAXN];
int f[20] ;
int main()
{
int n , m , g ;
while (scanf("%d",&n) != EOF)
{
if(n == 0)
break ;
scanf("%d%d",&m,&g);
int i;
for(i = 1 ; i <= m ; i ++)
{
scanf("%d",&f[i]);
}
for(i = 0; i < n ; i ++)
{
int sum = 0;
scanf("%s",s[i].name);
int h ;
scanf("%d",&h);
for(int j = 0 ; j < h ; j++)
{
int tmp;
scanf("%d",&tmp);
sum += f[tmp];
}
s[i].fen = sum ;
sum = 0 ;
}
int k;
int cnt = 0;
for(i = 0 ; i < n ; i ++) // 主要部分 : 选择排序
{
int max = -1 ;
int xu = i ;
int pan = 0;
for(k = i ; k < n ; k ++)
{
if(s[k].fen >= g) // 排序的条件
{
pan = 1;
if(max < s[k].fen) // 按分数的大小排序
{
max = s[k].fen ;
xu = k;
}
else if(max == s[k].fen)
{
int kk = strcmp(s[k].name,s[xu].name); //如果分数相同,则根据学号的前后排序
if(kk == -1)
{
xu = k ;
}
}
}
}
if(pan == 1)
{
s2[cnt].fen = max ;
strcpy(s2[cnt].name ,s[xu].name);
strcpy(s[xu].name , s[i].name);
s[xu].fen = s[i].fen ;
cnt ++;
}
}
printf("%d\n",cnt);
for(i = 0 ; i < cnt ; i++)
{
cout << s2[i].name ;
printf(" %d\n",s2[i].fen);
}
}
return 0 ;
}
这次 的周赛 主要 考察 手写排序 , 不能用STL , 在除了PROBLEM F 的其他题目中 ,我均是使用 选择排序 解答的 ,个人感觉,选择排序 比冒泡 好用多了, 用选择排序比较容易手写结构体排序,对于 PROBLEM F ,我使用选择排序 老是TLE , 原因是 不会 手写 快排, 所以 要尽快 掌握啊 ,那么接下来就来谈谈 PROBLEM E 的解题新的吧,因为这道题 充分考察了结构体的排序 和 字符串的 应用 。 请看上述代码 。。