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

时间:2019-12-02
本文章向大家介绍2019年华南理工大学软件学院ACM集训队选拔赛 Round1,主要包括2019年华南理工大学软件学院ACM集训队选拔赛 Round1使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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+7;
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=1;i<=n;i++){
            e[i].id=i;
            scanf("%d %d",&e[i].k,&e[i].w);
        }
        sort(e+1,e+1+n,cmp);//排序 
        for(int i=1;i<=n;i++) printf("%d ",e[i].id); puts("");//puts("")作用只是换行 
    }
    return 0;
}
View Code

原文地址:https://www.cnblogs.com/yourinA/p/11973615.html