题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805393241260032
思路
这题比较简单,就是理解题意花了很久
关键点在于设置初始值,未提交的设成-2,未通过编译的设成-1
还有ACnum以及isPrint两个标志位用于判断各类情况,其他都只是变量过多造成的复杂而已。
借鉴
另一种方式给出排名
for(int i = 1; i <= N; i++) {user[i].rank = i;if(i != 1 && user[i].total == user[i - 1].total)user[i].rank = user[i - 1].rank;}
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
struct Person{
int rank,id,total;
vector<int> score;
int ACnum;
bool isPrint;
};
bool cmp(Person a, Person b){
if(a.total!=b.total) return a.total > b.total;
else if(a.ACnum!=b.ACnum) return a.ACnum > b.ACnum;
else return a.id < b.id;
}
int main(){
int N,K,M;
int p[6];
//N是参加比赛的人数,K是问题数,M是提交数;
scanf("%d%d%d",&N,&K,&M);
vector<Person> user(N+1);
for(int i = 1; i <= K; i++){
scanf("%d",&p[i]);
}
//初始化数据
for(int i = 1; i <= N; i++){
user[i].score.resize(K+1,-2);
}
int tempid,tempnum,tempscore;
for(int i = 0; i < M; i++)
{
scanf("%d%d%d",&tempid,&tempnum,&tempscore);
user[tempid].id = tempid;
if (tempscore > user[tempid].score[tempnum])
user[tempid].score[tempnum] = tempscore;
}
/*for(int i = 1; i <= N; i++)
{
printf("%05d ",i);
for(int j = 1; j <= K; j++)
printf("%d :%d ",j,user[i].score[j]);
printf("\n");
}*/
for(int i = 1; i <= N; i++)
{
user[i].ACnum = 0;
user[i].isPrint = false;
user[i].total = 0;
for(int j = 1; j <= K; j++)
{
if(user[i].score[j]!=-1&&user[i].score[j]!=-2)
user[i].total += user[i].score[j];
if(user[i].score[j]==p[j])
user[i].ACnum ++;
if(user[i].score[j]>-1)
user[i].isPrint = true;
}
}
sort(user.begin()+1,user.end(),cmp);
for(int i = 1; i <= N; i++) {
user[i].rank = i;
if(i != 1 && user[i].total == user[i - 1].total)
user[i].rank = user[i - 1].rank;
}
for(int i = 1; i <= N; i++)
{
if(user[i].isPrint)
{
printf("%d %05d %d", user[i].rank, user[i].id, user[i].total);
for(int j = 1; j <= K; j++) {
if(user[i].score[j] != -1 && user[i].score[j] != -2)
printf(" %d", user[i].score[j]);
else if(user[i].score[j] == -2)
printf(" -");
else if(user[i].score[j] == -1)
printf(" 0");
}
printf("\n");
}
}
return 0;
}
