天梯赛L2-027 名人堂与代金券
题目详情:
思路:
这题在L2中算是简单题,一个结构体,用sort结构体排序,然后是要注意输出名次时要注意用一个变量来存储i名次
如果不并列,那么num = i的值,如果并列num的值不变
详细代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 5;
struct node
{
string s;
int grade;
}stu[maxn];
bool cmp(node x, node y)
{
if(x.grade != y.grade)
return x.grade > y.grade;
else
return x.s < y.s;
}
int n,g,k;
int main()
{
cin>>n>>g>>k;
int sum = 0;
for(int i=1; i<=n; i++)//从1开始方便名次的输出
{
cin>>stu[i].s>>stu[i].grade;
if(stu[i].grade >= g && stu[i].grade <= 100)
sum += 50;
else if(stu[i].grade >= 60 && stu[i].grade < g)
sum += 20;
}
sort(stu+1, stu+n+1, cmp);
cout<<sum<<endl;
int num = 0;
for(int i=1; i<=n; i++)
{
if(stu[i].grade != stu[i-1].grade)//如果不并列,那么num = i的值,如果并列num的值不变
{
//cout<<i<<" ";如果不用一个变量来输出名次,会少输出并列的第五名
num = i ;
}
//else{ //cout<<i-1<<" "; num = i - 1; }//去掉这句话,满分,加上的话18分。为什么呢?
//因为如果三个人都并列成绩的话,就会出错。
if(num > k) //输出的名次够了,就跳出循环
break;
cout<<num<<" "<<stu[i].s<<" "<<stu[i].grade<<endl;
}
}