这一题,比较麻烦,可以说是简单的结构体的应用。
输入的数据量比较大,用scanf比较好一点,还有一点比较难的是如果分数一样,要按考生号的升序来输出。
我用一个结构体来存每一个考生的考号和总成绩,然后排序,算出有几个合格,再输出。
下面的是一次AC的代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; class data { public: char str[25]; //考号 int sum; //总成绩 }; data student[1005]; int cmp(const data& a, const data& b) //排序从大到小 { if(a.sum != b.sum) //分数不一样 return a.sum > b.sum; else //分数一样的,比较麻烦 { int x = 0, y = 0; int len1 = strlen(a.str); int len2 = strlen(b.str); int i = 0, j = 0; while((a.str[i] >= 'A' && a.str[i] <= 'Z') || (a.str[i] >= 'a' && a.str[i] <= 'z')) //忽略前面的字母 i++; while(a.str[i] != '\0') //算a的考号后面的数字 { x += x * 10 + (a.str[i] - '0'); i++; } while((b.str[j] >= 'A' && b.str[j] <= 'Z') || (b.str[j] >= 'a' && b.str[j] <= 'z')) //忽略前面的字母 j++; while(b.str[j] != '\0') //算b的考号后面的数字 { y += y * 10 + (b.str[j] - '0'); j++; } return x < y; //从小到大排 } } int main() { // freopen("data.txt", "r", stdin); int N, M, G; int sroce[12], i, j, k; while(scanf("%d", &N) != EOF && N != 0) //输入 { scanf("%d%d", &M, &G); for(i = 1; i <= M; i++) //每一题的分数 scanf("%d", &sroce[i]); for(i = 0; i < N; i++) { scanf("%s%d", student[i].str, &j); //输入考号和做对几题 student[i].sum = 0; while(j--) { scanf("%d", &k); student[i].sum += sroce[k]; //将分数加起来 } } sort(student, student + N, cmp); //排序 int count = 0; for(i = 0; i < N; i++) //算合格的几个 { if(student[i].sum >= G) count++; else break; } printf("%d\n", count); //输出 for(i = 0; i < count; i++) printf("%s %d\n", student[i].str, student[i].sum); } return 0; }
原文地址:http://blog.csdn.net/qq_25425023/article/details/45457505