题目大意
给n个学生的邮箱地址和成绩 和成绩分界点g 名人堂人数k
统计总共发多少奖学金 按要求输出名人堂(成绩从大到小 一样成绩的话按字典序输出)
代码
#include<bits/stdc++.h>
using namespace std;
struct Node
{
string s;
int fen;
}a[20100];
bool cmp(Node i, Node j)
{
if(i.fen != j.fen) return i.fen > j.fen;
if(i.fen == j.fen && strcmp(i.s.c_str(),j.s.c_str()) < 0)
return true;
else
return false;
}
int main()
{
int n,g,k;
cin >> n >> g >> k;
int sum = 0;
for(int i =0;i<n;i++)
{
cin>>a[i].s>>a[i].fen;
if(a[i].fen>=g&&a[i].fen<=100)
sum+=50;
else if(a[i].fen>=60 &&a[i].fen<g)
sum+=20;
}
printf("%d\n",sum);
sort(a,a+n,cmp);
int t1 = 0,t2 = 1;//t1序列 t2名次
while(t2<=k && t1 < n)
{
if(!t1)
{
cout << t2 << " " << a[t1].s << " " << a[t1].fen<<endl;
t1++;
}
else
{
if(a[t1-1].fen == a[t1].fen)//分数一样 输出名次
{
cout << t2 << " " << a[t1].s << " " << a[t1].fen <<endl;
t1++;
}
else//分数不一样
{
if(t1+1>k)
break;
cout << t1+1 <<" "<< a[t1].s <<" " <<a[t1].fen<<endl;
t2 = t1+1;
t1++;
}
}
}
return 0;
}
总结
因为不清楚利用cmp排序的本质 搞了半天没办法实现先按成绩从高到低排 如果有一样的成绩就按字典序从小到大排
正确写法是
bool cmp(Node i, Node j)
{
if(i.fen != j.fen) return i.fen > j.fen;//成绩不一样 按成绩从大到小排
if(i.fen == j.fen && strcmp(i.s.c_str(),j.s.c_str()) < 0) //成绩一样 strcmp 比较字典序 小的话返回<0 大的话>0 一样返回0
return true; //true 代表 i在j前面
else
return false; //false 代表 i j 要换顺序
}