Error message here!

Hide Error message here!

忘记密码?

Error message here!

请输入正确邮箱

Hide Error message here!

密码丢失?请输入您的电子邮件地址。您将收到一个重设密码链接。

Error message here!

返回登录

Close

2019年华南理工大学软件学院ACM集训队选拔赛 Round1

友人Aqaq 2019-12-02 22:08:00 阅读数:11 评论数:0 点赞数:0 收藏数:0

T1 橘猫的AC

这道题其实就是单纯对数据进行排序,但是因为关键字不止一种(解题数m和罚时t) 并且输出的是队伍的名字(也就是序号)

而正常排序完之后我们就会发现 我们并不知道当前各个位置的数对应的队伍名是什么了(也就是其原本的位置信息已经在排序过程中丢失了)

这个时候我们发现 一个队伍有三种信息 解题数 罚时 以及队伍名 我们需要把这三种信息作为一个整体再将这个整体按照内部的信息(解题数以及罚时)进行排序

这个时候我们就需要用到结构体了 也就是这个东西

 然后利用sort函数将结构体进行排序 但是这里我们需要自定义一个比较函数 按照自己的想法将结构体进行排序 这也就是代码中的cmp函数的作用

 这里用到了三木运算符 不了解的同学可以百度一下他的用法 这里的cmp可以理解为先比较a和b的解题数,解题数多的在前,解题数一样再比较罚时,罚时多的在后

这样之后通过sort函数进行排序再按顺序输出id就可以解决问题了!

贴一下代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#include<set>
#define LL long long
using namespace std;
const int M=1e5+;
int T,n;
struct node{int id,k,w;}e[M];//k表示解题数w表示罚时id表示队伍名 
bool cmp(node a,node b){return a.k==b.k?a.w<b.w:a.k>b.k;}//自定义的比较函数 
int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        for(int i=;i<=n;i++){
            e[i].id=i;
            scanf("%d %d",&e[i].k,&e[i].w);
        }
        sort(e+,e++n,cmp);//排序 
        for(int i=;i<=n;i++) printf("%d ",e[i].id); puts("");//puts("")作用只是换行 
    }
    return ;
}
View Code

 

版权声明
本文为[友人Aqaq]所创,转载请带上原文链接,感谢
https://www.cnblogs.com/yourinA/p/11973615.html