L2-027. 名人堂与代金d券

题目大意

给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 要换顺序
}
上一篇:「HTML+CSS」--自定义加载动画【027】


下一篇:L1-027 出租 (20 分)