• 结构体的sort排序


    结构体用sort快排的方法

    struct node{
        int k,s;
    }p[5005];
    
    bool cmp1(node x,node y){
        return x.s>y.s;   //定义降序排序(从大到小) 
    }
    bool cmp2(node x,node y){
        return x.k<y.k;   //定义升序排序(从小到大) 
    }
    sort(p+1,p+n+1,cmp2); //排序 

    看题目,洛谷p1068

    题目描述

    世博会志愿者的选拔工作正在 A 市如火如荼的进行。为了选拔最合适的人才,A市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根据计划录取人数的150%划定,即如果计划录取m名志愿者,则面试分数线为排名第m×150%(向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试分数线的所有选手。

    现在就请你编写程序划定面试分数线,并输出所有进入面试的选手的报名号和笔试成绩。

    输入输出格式

    输入格式:

     

    第一行,两个整数 n,m(5 ≤ n ≤ 5000,3 ≤ m ≤ n),中间用一个空格隔开,其中n表示报名参加笔试的选手总数,m表示计划录取的志愿者人数。输入数据保证 m×150%向下取整后小于等于 n。

    第二行到第 n+1行,每行包括两个整数,中间用一个空格隔开,分别是选手的报名号 k(1000 ≤ k ≤ 9999)和该选手的笔试成绩s(1 ≤ s ≤ 100)。数据保证选手的报名号各不相同。

     

    输出格式:

     

    第一行,有2个整数,用一个空格隔开,第一个整数表示面试分数线;第二个整数为进入面试的选手的实际人数。

    从第二行开始,每行包含2个整数,中间用一个空格隔开,分别表示进入面试的选手的报名号和笔试成绩,按照笔试成绩从高到低输出,如果成绩相同,则按报名号由小到大的顺序输出。

     

    输入输出样例

    输入样例#1: 
    6 3 
    1000 90 
    3239 88 
    2390 95 
    7231 84 
    1005 95 
    1001 88
    输出样例#1: 
    88 5 
    1005 95 
    2390 95 
    1000 90 
    1001 88 
    3239 88 

    说明

    【样例说明】

    m×150%=3×150%=4.5,向下取整后为4。保证44个人进入面试的分数线为88,但因为88有重分,所以所有成绩大于等于88 的选手都可以进入面试,故最终有5个人进入面试。

    NOIP 2009 普及组 第二题

     

     

    这道题就是一个典型的结构体的排序

    但是首先需要面试成绩的从大到小的排序,然后才是相同的成绩再去从小到大对编号去排序。

    而sort是一个不稳定的排序,因为当数据量稍大时,sort()就会使用快速排序,而快速排序是不稳定排序,即不能保证原序列中相等的元素在排序后保持相对位置不变。

    即如果排序之后的两者成绩相同,但是由于快排是不停的交换位置的排序,所以相同成绩的两者的相对位置会变换,所以造成的不稳定排序。

    稳定排序的概念:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r [ i ]=r [ j ],且r [ i ]在r [ j ]之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。

    所以这题应该用的是STL里面的稳定排序stable_sort。

    AC代码:

    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    struct node{
        int k,s;
    }p[5005];
    
    bool cmp1(node x,node y){
        return x.s>y.s;   //定义降序排序(从大到小) 
    }
    bool cmp2(node x,node y){
        return x.k<y.k;   //定义升序排序(从小到大) 
    }
    
    int main(){
        int n,m;
        cin>>n>>m;
        m=m*15/10;
        for(int i=1;i<=n;i++){
            cin>>p[i].k>>p[i].s;
        }
        sort(p+1,p+n+1,cmp2); //快排排序 
        stable_sort(p+1,p+n+1,cmp1); //稳定排序
        cout<<p[m].s<<" ";
        for(int i=m+1;i<=n;i++){
            if(p[i].s==p[m].s){
                m++;
            }
            else break;
        }
        cout<<m<<endl;
        for(int i=1;i<=m;i++){
            cout<<p[i].k<<" "<<p[i].s<<endl;
        }
        return 0;
    }

     

    还有一种是对字符串的结构体sort排序。

    题目背景

    宇宙总统竞选

    题目描述

    地球历公元6036年,全宇宙准备竞选一个最贤能的人当总统,共有n个非凡拔尖的人竞选总统,现在票数已经统计完毕,请你算出谁能够当上总统。

    输入输出格式

    输入格式:

     

    president.in

    第一行为一个整数n,代表竞选总统的人数。

    接下来有n行,分别为第一个候选人到第n个候选人的票数。

     

    输出格式:

     

    president.out

    共两行,第一行是一个整数m,为当上总统的人的号数。

    第二行是当上总统的人的选票。

     

    输入输出样例

    输入样例#1: 复制
    5
    98765
    12365
    87954
    1022356
    985678
    
    输出样例#1: 复制
    4
    1022356

    说明

    票数可能会很大,可能会到100位数字。

    n<=20

    AC代码:

    #include<iostream>
    #include<algorithm>
    using namespace std;
    typedef struct{
        string str;
        int p;
    }aaa;
    
    bool cmp(aaa a,aaa b){
        if(a.str.size()==b.str.size()){
            return a.str<b.str; 
        }
        return a.str.size()<b.str.size();
    }
    int main(){
        aaa m[22];
        int n;
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>m[i].str;
            m[i].p=i;
        }
        sort(m+1,m+n+1,cmp);
        cout<<m[n].p<<endl<<m[n].str;
        return 0;
    } 
  • 相关阅读:
    jQuery:balloon气泡提示插件
    等高布局
    html5 语音搜索
    JS编码三种方法的区别:escape、encodeURI和encodeURIComponent
    为什么要两次调用encodeURI来解决乱码问题
    关于时间差查询的一个小技巧
    MySQL对时间的处理总结
    闭包总结:从执行环境来看闭包和垃圾回收
    闭包总结:闭包的7种形式
    JavaScript里面向对象的继承:不使用构造函数实现"继承"
  • 原文地址:https://www.cnblogs.com/wushengyang/p/10865369.html
Copyright © 2020-2023  润新知