#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 的解题新的吧,因为这道题 充分考察了结构体的排序 和 字符串的 应用 。 请看上述代码 。。