题目思路很简单直白,但是代码上还是很复杂的,需要千万细心。
还有这道题的输出要求也太复杂了8。
是否提交 | 编译是否通过 | 输出形式 | 输出分数 |
---|---|---|---|
y | y | 分数 | 分数 |
y | n | 若满足任意其他输出条件则输出,否则不输出 | 0 |
n | n | 若满足任意其他输出条件则输出,否则不输出 | - |
所以要分别记录是否提交和是否编译通过。
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int n, k, m;
struct table
{
int id;
int score;
int profectnum;
};
bool cmp(table t1,table t2)
{
if (t1.score == t2.score)
{
if (t1.profectnum == t2.profectnum)
return t1.id < t2.id;
else
return t1.profectnum > t2.profectnum;
}
else
return t1.score > t2.score;
}
vector<table> table_sort(vector<vector<int>> &students)
{
vector<table> T;
table t;
for (int i = 1; i <= n; i++)
{
if (students[i][0] != -1)
{
t.id = i;
t.score = students[i][0];
t.profectnum = students[i][k + 1];
T.push_back(t);
}
}
sort(T.begin(), T.end(), cmp);
return T;
}
int main()
{
cin >> n >> k >> m;
vector<int> fullscore(k + 1);
for (int i = 1; i <= k; i++)
cin >> fullscore[i];
vector<vector<int>> students(n + 1, vector<int>(k + 2, -1));
//0处留下记录总分,k+1处记录是否输出
//对于每个学生的每一题-1为未提交,-2为编译未通过
int useid, questionid, score;
for (int i = 0; i < m; i++)
{
scanf("%d %d %d", &useid, &questionid, &score);
if (score == -1)
{
if (students[useid][questionid] == -1)
students[useid][questionid] = -2;
}
else if (score > students[useid][questionid])
{
students[useid][questionid] = score;
}
}
bool hassubmit = false;
for (int i = 1; i <= n; i++)
{
hassubmit = false; //hassubmit记录是否输出
students[i][0] = 0;
students[i][k + 1] = 0;
for (int j = 1; j <= k; j++)
if (students[i][j] >= 0)
{
students[i][0] += students[i][j];
hassubmit = true;
if (students[i][j] == fullscore[j])
students[i][k + 1]++;
}
if (!hassubmit)
students[i][0] = -1;//分数处为-1代表不输出
}
vector<table> T = table_sort(students);
//只对id进行表排序千万不要移动数组
int id;
score = -1;
int rank = 0, rconut = 0;
for (auto it = T.begin(); it != T.end() ; it++)
{
rconut++;
if (it->score != score)
{
rank = rconut;
score = it->score;
}
id = it->id;
printf("%d %05d %d",rank,id,score);
for (int i = 1; i <= k; i++)
{
if (students[id][i] == -1)
printf(" -");
else if (students[id][i] == -2)
printf(" 0");
else
printf(" %d", students[id][i]);
}
printf("\n");
}
return 0;
}