解题过程的小记录,如有错误欢迎指出。
难度:两星(这简直是英语阅读理解题嘛)
题目分析
给出一堆提交记录,要求按给定的规则输出排名
注意点
- 提交成功过的人,如果有题目编译不通过显示的是0而不是"-"
- 从来没有通过编译的人不显示
- 通过一次编译哪怕总分是0分也显示
- "-"仅代表此题从未提交过而不是提交了编译不通过
我的解题过程
思路
设置user结构体【此题的难点在于结构体的设置,因为要分辨是从未提交的总分0还是提交过后的总分0,此种样例在给出的例子中没有但检测点中有】,输入数据,采用first结构变量进行标识此人有否成功通过编译过,然后采用flag[]来标记某一题是否提交过【若提交过哪怕是不通过编译也显示0,否者显示"-"】。输入完数据后采用valid数组输入有效的数据进行排名显示
bug
因为刚开始没有理解透什么需要输出,忽略输出了总分为0但通过编译的人需要输出所以错误
代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int K;//总题数
int s[5];//各题的分数
struct user {
int id;
int score[5] = { 0 };
bool flag[5] = { false };//用来记录该题是否提交过
int total = 0;
int perfect = 0;
int rank;
bool first = false;
};
int comp1(user u1, user u2) {
if (u1.total != u2.total) return u1.total > u2.total;
else return u1.perfect != u2.perfect ? u1.perfect > u2.perfect:u1.id < u2.id;
}
int main()
{
int N, M;
cin >> N >> K >> M;
for (int i = 0; i < K; i++) {
cin >> s[i];
}
vector<user> users(N), valid;
for (int i = 0; i < N; i++) {
users[i].id = i + 1;
}
for (int i = 0; i < M; i++) {
int id, pro_num, pro_score;
cin >> id >> pro_num >> pro_score;
id--;
pro_num--;
if (pro_score != -1) users[id].first = true; //**关键点:说明第一次通过编译,那么此人不管总分多少都会有显示
if (users[id].flag[pro_num] == false) {
users[id].flag[pro_num] = true;
if (pro_score != -1) {
users[id].score[pro_num] = pro_score;
}
}
else {
if (pro_score > users[id].score[pro_num])
users[id].score[pro_num] = pro_score;
}
}
for (int i = 0; i < N; i++) {
//bool f = false;********有了first变量后这个就不需要了
for (int j = 0; j < K; j++) {
//if (users[i].flag[j] == true) f = true;
if (users[i].score[j] == s[j]) users[i].perfect++;
users[i].total += users[i].score[j];
}
if (users[i].first) valid.push_back(users[i]);
}
sort(valid.begin(), valid.end(), comp1);
printf("1 %05d %d", valid[0].id, valid[0].total);
valid[0].rank = 1;
for (int i = 0; i < K; i++) {
if (valid[0].flag[i] != false)
printf(" %d", valid[0].score[i]);
else
printf(" -");
}
printf("\n");
for (int i = 1; i < valid.size(); i++) {
if (valid[i].total == valid[i - 1].total) {
valid[i].rank = valid[i - 1].rank;
}
else {
valid[i].rank = i + 1;
}
printf("%d %05d %d", valid[i].rank, valid[i].id, valid[i].total);
for (int j = 0; j < K; j++) {
if (valid[i].flag[j] != false)
printf(" %d", valid[i].score[j]);
else {
printf(" -");//这题从未提交过
}
}
printf("\n");
}
return 0;
}
dalao的代码
全部代码因版权原因不放出来,大家可以自行去柳神博客购买或者参考晴神的上机笔记~
借鉴点
- 可以在输入的时候就计算完美题数
- 可以将score全部初始化为-1,然后有提交时,编译不通过改为0,编译通过改为对应分数,这样就省去了flag的设置