刚读题的时候没仔细就按自己的想法直接不考虑60分以下的同学其实不然测试点3是全60分以下的虽然代金卷发放为0但是如果K>0则仍然要输出排名前K位的同学如果不考虑60分以下的就出错了测试点2排名前K位中是含有60分以下的同学。
整体来说这道题在l2中算简单的一个sort就解决了问题只是输出的时候需要细心点不要因小失大粗心不考虑60分以下的同学找了10多分钟bugT_T;
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
struct node{
string id;
int score;
};
bool rule(node a1,node a2){
if(a1.score==a2.score){
return a1.id<a2.id;
}else{
return a1.score>a2.score;
}
}
int main(){
int N,G,K;
cin>>N>>G>>K;
vector<node>student;
int sum=0;
while(N--){
string id;
int score;
cin>>id>>score;
if(score<G&&score>=60){
sum+=20;
}else if(score>=G){
sum+=50;
}
node temp;
temp.id=id;
temp.score=score;
student.push_back(temp);
}
cout<<sum<<"\n";
sort(student.begin(),student.end(),rule);
int pm=1;//名次
int c=1;
if(student.empty()){
return 0;
}
int start=student[0].score;
for(int i=0;i<student.size();i++){
if(student[i].score<start){
pm+=c;
start=student[i].score;
c=1;
}else if(student[i].score==start&&i!=0){
c++;
}
if(pm>K)break;
cout<<pm<<" "<<student[i].id<<" "<<student[i].score<<"\n";
}
return 0;
}