这题要考虑的细节太多了,实不相瞒我做吐了,并不难,就是要考虑很多细节一遍遍调,,,
还没全通过,,最后一个测试点过不了,,太菜了
#include<iostream>
#include<vector>
#include<iomanip>
#include<algorithm>
#include<cstring>
using namespace std;
struct Stu {
int id = 0;//为0是默认。
int rank = 0;
int getScore[6];//标号从1开始
int fullScore = 0;
int perfect = 0;//完整题数
Stu() {
//memset(getScore, -2, sizeof(getScore));//注意这里要考虑根本没做和做了0分和编译不通过-1三种情况。-2是没做
for (int i = 0; i < 6; i++) {
getScore[i] = -2;
}
}
};
bool mygreater(Stu s1, Stu s2) {
if (s1.fullScore > s2.fullScore)return true;
else if (s1.fullScore < s2.fullScore) return false;
else {
if (s1.perfect > s2.perfect) return true;
else if (s1.perfect < s2.perfect) return false;
else {
if (s1.id < s2.id)return true;
else return false;
}
}
}
int main() {
int N, K, M;//N用户数 K总题目数 M提交数
int tid, tq, tscore;//每个提交的用户id,题目号,得分
cin >> N >> K >> M;
Stu stuList[10005];
int score[6];
//题目总分
for (int i = 1; i <= K; i++) {
int st = 0;
cin >> st;
score[i] = st;
}
for (int i = 0; i < M; i++) {
cin >> tid >> tq >> tscore;//tid从1开始
stuList[tid].id = tid;
//取较高的分数
//有提交记录要么是-1 要么0 要么得分
int temp = stuList[tid].getScore[tq];
if (temp < tscore) {
stuList[tid].getScore[tq] = tscore;
}
}
for (int i = 1; i <= N; i++) {
//计算总分
for (int j = 1; j <= K; j++) {//这里注意如果是-2代表没做 -1代表编译未通过 都要跳过
int ts = stuList[i].getScore[j];
if (ts == -1 || ts==-2) continue;
stuList[i].fullScore += ts;
}
//计算完美解决数
for (int j = 1; j <= K; j++) {
if (stuList[i].getScore[j] == score[j])
stuList[i].perfect++;
}
}
//排序
sort(stuList + 1, stuList + N + 1, mygreater);
//输出
for (int i = 1; i <= N; i++) {
//这里注意 如果所有得分要么是-2(没做)要么是-1(编译未通过)不打印
int noSub = 1;
for (int n = 1; n <= K; n++) {
if (stuList[i].getScore[n] != -2 && stuList[i].getScore[n] != -1) {
noSub = 0;
break;
}
}
if (noSub == 1)continue;
//计算排名
int temprank = 1;
if (i != 1) {
if (stuList[i].fullScore == stuList[i - 1].fullScore) {
temprank = stuList[i - 1].rank;
}
else
temprank = i;
}
stuList[i].rank = temprank;
cout << stuList[i].rank << ' ' << setw(5) << setfill('0') << stuList[i].id << ' ' << stuList[i].fullScore;
for (int j = 1; j <= K; j++) {
if (stuList[i].getScore[j] == -2) cout << " " << "-";
else if (stuList[i].getScore[j] == -1) cout << " " << 0;
else cout << " " << stuList[i].getScore[j];
}
if (i != N) cout << endl;
}
}