思路:
这题意思是连续的学号,我一开始以为是分开的学号,然后搞得数组很大,超时了一个测试点,后面都改了一遍。还是挺有难度的。逻辑要清晰点,条件要写齐。比如这两个条件我就有遗忘,理所当然了。先拿输入的成绩比较,最后再换这样分开好一些。蓝瘦香菇鸭~——————————————————————————————————————————————————
#include<iostream> #include<algorithm> #include<cstring> using namespace std; struct student { int id; int score[6]; int fullcount = 0; bool flag = false; int allscore = 0; int rank; }stu[100001]; bool cmp(student a, student b) { if (a.allscore != b.allscore) return a.allscore > b.allscore; else if (a.fullcount != b.fullcount) return a.fullcount > b.fullcount; else return a.id < b.id; } int full[5]; int main() { int n, k, m; cin >> n >> k >> m; for (int i = 1; i <= n; i++) { stu[i].id = i; memset(stu[i].score, -1, sizeof(stu[i].score)); } for (int i = 1; i <= k; i++) { cin >> full[i]; } int id = 0, testid = 0, score = -1; for (int i = 0; i < m; i++) { cin >> id >> testid >> score; if (score >= 0) { stu[id].flag = 1; } if (score == -1&&stu[id].score[testid]==-1) { stu[id].score[testid] = 0; } if (score == full[testid]&&stu[id].score[testid]<full[testid]) { stu[id].fullcount++; } if (score > stu[id].score[testid]) { stu[id].score[testid] = score; } } for (int i = 1; i <= n; i++) { for (int j = 1; j <= k; j++) { if (stu[i].score[j] != -1) { stu[i].allscore += stu[i].score[j]; } } } sort(stu+1, stu + n+1, cmp); stu[1].rank = 1; for (int i = 2; i <= n&&stu[i].flag; i++) { if (stu[i].allscore == stu[i - 1].allscore) { stu[i].rank = stu[i - 1].rank; } else { stu[i].rank = i; } } for(int i = 1; i <=n; i++) { if (stu[i].flag) { cout << stu[i].rank; printf(" d %d",stu[i].id,stu[i].allscore); for (int j = 1; j <= k; j++) { if (stu[i].score[j] >= 0) cout << " " << stu[i].score[j]; else cout << " " << "-"; } cout << endl; } } return 0; }