这道题细节贼多...需要注意很多点
- 不能用cout,会超时
- 排名是根据总分排序,输出要考虑总分,达到满分题目个数,以及id编号
- 注意编译错误和没有提交题目,可以用不同的数字来表示
- 消极做题的没有资格输出(没有提交过或者编译没有通过过)
给出代码:
#include <iostream>
#include<vector>
#include <cstring>
#include <climits>
#include <map>
#include <algorithm>
using namespace std;
struct Stu{
int id{};
int tolSco{};
int pInt[6]{};
int c=0;
bool del=true;
int rank{};
};
bool cmp(Stu* stu1,Stu* stu2){
if (stu1->tolSco!=stu2->tolSco){
return stu1->tolSco>stu2->tolSco;
}
if (stu1->c!=stu2->c) {
return stu1->c > stu2->c;
}
return stu1->id<stu2->id;
}
int main() {
int score[6];
int N,K,M;
cin>>N>>K>>M;
Stu* stus[N];
map<int,Stu*> map1;
for (int i = 1; i <= K; ++i) {
cin>>score[i];
}
for (int j = 0; j < N; ++j) {
stus[j]=new Stu();
stus[j]->id=j+1;
for (int i = 1; i <= K; ++i) {
stus[j]->pInt[i]=INT_MIN;
}
map1[stus[j]->id]=stus[j];
}
for (int k = 0; k < M; ++k) {
int id,i,sco;
cin>>id>>i>>sco;
int val=map1[id]->pInt[i];
map1[id]->pInt[i]=max(val,sco);
}
for (int l = 0; l < N; ++l) {
int sum=0;
for (int i = 1; i <=K ; ++i) {
if (stus[l]->pInt[i]>-1) {
sum += stus[l]->pInt[i];
stus[l]->del= false;
}
if (stus[l]->pInt[i]==score[i]){//达到了满分
stus[l]->c++;
}
}
stus[l]->tolSco=sum;
}
sort(stus,stus+N,cmp);
int rank=1;
stus[0]->rank=rank;
rank++;
for (int i = 1; i < N; ++i) {
if (stus[i]->tolSco!=stus[i-1]->tolSco){
stus[i]->rank=rank;
} else{
stus[i]->rank=stus[i-1]->rank;
}
rank++;
}
for(auto stu:stus){
if (stu->del){
continue;
}
cout<<stu->rank<<" ";
printf("%05d %d",stu->id,stu->tolSco);
for (int i = 1; i <=K ; ++i) {
if (stu->pInt[i]==INT_MIN){
printf(" -");
}else if(stu->pInt[i]==-1){
printf(" 0");
} else{
printf(" %d",stu->pInt[i]);
}
}
cout<<endl;
}
return 0;
}