『ACM C++』HDU杭电OJ | 1425 - sort (排序函数的特殊应用)

  今天真的是累哭了,周一课从早八点半一直上到晚九点半,整个人要虚脱的感觉,因为时间不太够鸭所以就回头看看找了一些比较有知识点的题来总结总结分析一下,明天有空了就开始继续打题,嘻嘻嘻。

今日兴趣电影:

《超能查派》

  这是一部关于未来人工智能的一个故事,感觉特别有思维开拓性,一个程序员写出了真正的AI智能机器人,可以从婴儿开始学习,然后以极快极强的学习速度不断成长,最后拯救身边人的故事。很感人,强烈推荐哈哈~

爱奇艺:https://www.iqiyi.com/v_19rroly1wo.html?flashvars=videoIsFromQidan%3Ditemviewclkrec#vfrm=5-7-0-1

------------------------------------------------题目----------------------------------------------------------

Sort

Problem Description

给你n个整数,请按从大到小的顺序输出其中前m大的数。

Input

每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-500000,500000]的整数。

Output

对每组测试数据按从大到小的顺序输出前m大的数。

Sample Input

5 3
3 -35 92 213 -644

Sample Output

213 92 3

------------------------------------------------题目----------------------------------------------------------

(一) 题目分析:

    题目其实很简单,直接使用sort函数就可以了,没有太多的想法,特别地方就是对sort的排序规则进行自定义而已。这题没必要用什么冒泡啊快排了,只是巩固sort的用法,而今天这篇文章就对sort函数进行研究。

(二)代码分块:

    第一步:先规定sort的排序规则:

bool cmp(long long int a,long long int b){
    return a>b;
}

    第二步:使用sort排序再输出即可:

        sort(num,num+N,cmp);
        for(i = 0;i<M;i++)
        {
            if(i<M-1) printf("%lld ",num[i]);
            else{
                printf("%lld\n",num[i]);
                break;
            }
        }

(三)AC代码:

#include<stdio.h>
#include <algorithm>
using namespace std;
long long int num[1000005];
long long int N,M,i;
bool cmp(long long int a,long long int b){
    return a>b;
}
int main()
{
    while(~scanf("%lld%lld",&N,&M))
    {
        for(i = 0;i<N;i++) scanf("%lld",&num[i]);
        sort(num,num+N,cmp);
        for(i = 0;i<M;i++)
        {
            if(i<M-1) printf("%lld ",num[i]);
            else{
                printf("%lld\n",num[i]);
                break;
            }
        }
    }
    return 0;
 } 

(四)AC截图:

(五)解后分析:

    这里想要总结一下sort一些特殊用法,所以就把sort完完整整的说一遍吧~当作对自己的复习嘻嘻嘻。

    A、sort:

#include <algorithm>

template< class RandomIt >
void sort( RandomIt first, RandomIt last );

template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );

    时间复杂度:n*log10(n)

    实现原理:除了对普通的快速排序进行优化,它还结合了插入排序堆排序。根据不同的数量级别以及不同情况,能自动选用合适的排序方法。

    (参考:http://www.cnblogs.com/fengcc/p/5256337.html)

    函数原型:sort(first_pointer,first_pointer+n,cmp)

    注意:当cmp不写时,默认是升序排序

    B、自定义cmp比较函数的使用方法:

    (1)数组排序自定义:

    在本题中,就使用了数组排序的自定义化,核心代码:

int A[1000];
bool cmp(int a,int b)//int为数组数据类型
{
    return a>b;//降序排列
}
sort(A,A+1000,cmp);

    (2)结构排序自定义:

    这个自定义也是经常遇到的,因为经常要做线性表的一个插入删除排序查找工作,核心代码:

Student stu[1000];
bool cmp(Student a,Student b)
{
    return a.id>b.id;//按照学号降序排列
}
sort(Stu,Stu+1000,cmp);

    核心就在return处进行细微的修改处理啦~同理应该能够用到类了~

    

    C、重载结构体或类的比较运算符:

    (1)直接在结构体里进行重载比较运算符:

typedef struct Student{
    int id;
    string name;
    double grade;

    bool operator<(const Student& s)
    {
        return id>s.id;//降序排列
    }
};
vector<Student> V;
sort(V.begin(),V.end());

    这里用到了vector容器,是在ACM集训中学到的,前阵子还没开通博客也没来得及总结学习,坚持每天一个博客,努力把总结内容补起来~

    (2)直接声明重载:

vector<Student> V;
bool operator<(const Student& s1, const Student& s2)
{
    return s1.id>s2.id;//降序排列
}
sort(V.begin(),V.end());

    注意:sort默认使用的是<运算符,所以要针对<来重载,而不能使用>哦~

    

    D、使用标准库中的函数:

    functional提供了一堆基于模板的比较函数对象,

    但sort要用到的也只是greater和less就够了:

      升序:sort(begin,end,less<data-type>())

      降序:sort(begin,end,greater<data-type>())

    缺点:也只是实现简单的排序,结构体不适用,所以推荐自己写规则吧~。

注:如果有更好的解法,真心希望您能够评论留言贴上您的代码呢~

原文地址:https://www.cnblogs.com/winniy/p/10434667.html

时间: 2024-10-08 03:50:47

『ACM C++』HDU杭电OJ | 1425 - sort (排序函数的特殊应用)的相关文章

『ACM C++』HDU杭电OJ | 1415 - Jugs (灌水定理引申)

今天总算开学了,当了班长就是麻烦,明明自己没买书却要带着一波人去领书,那能怎么办呢,只能说我善人心肠哈哈哈,不过我脑子里突然浮起一个念头,大二还要不要继续当这个班委呢,既然已经体验过就可以适当放下了吧,用心在自己的研究上.晚上级会开完也就八点多了,开始打打题,今天在HDU杭电的ACM集训题看到一个奇葩的题,前来献上. 今日推荐: <全球风暴> 一部宇宙航空和地球气候片的良心佳作,后期特效建模都是特别杠杠的大片,不会让你失望的哟,我已经三刷了哈哈哈.这部片在爱奇艺有上线,有兴趣的朋友可以看看鸭.

EXCEL排序(杭电1862)(sort排序)

EXCEL排序 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 13392    Accepted Submission(s): 5254 Problem Description Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能. Input 测试输入包含若干测试用例.每个测试用例的第1行包含两个整数 N (<=1

杭电OJ(HDU)-ACM Steps-Chapter Two-《Biker&#39;s Trip Odometer》《Climbing Worm》《hide handkerchief》《Nasty Hac》

1.2.1 Biker's Trip Odometer #include<stdio.h> #include<math.h> const double PI=acos(-1.0); /* 计算题,根据公式做就行,PI*d*r/(12*5280);res1/t*3600; Sample Input 26 1000 5 27.25 873234 3000 26 0 1000 Sample Output Trip #1: 1.29 928.20 Trip #2: 1179.86 1415

杭电OJ(HDU)-ACMSteps-Chapter Two-《An Easy Task》《Buildings》《decimal system》《Vowel Counting》

http://acm.hdu.edu.cn/game/entry/problem/list.php?chapterid=1§ionid=2 1.2.5 #include<stdio.h> /* 题意:找闰年. if((i%4==0 && i%100!=0) || i%400==0)count++; 3 2005 25 1855 12 2004 10000 2108 1904 43236 */ int main() { int t,y,n; int i,count=0; whil

杭电OJ(HDU)-ACMSteps-Chapter Three-《FatMouse&amp;#39; Trade》《今年暑假不AC》《排名》《开门人和关门人》

http://acm.hdu.edu.cn/game/entry/problem/list.php?chapterid=1§ionid=3 1.3.1 FatMouse' Trade #include <algorithm> /* 题意:价值/代价的比值来排序,买比值大的. Sample Input 5 3 7 2 4 3 5 2 20 3 25 18 24 15 15 10 -1 -1 Sample Output 13.333 31.500 */ #include<stdio.h>

杭电OJ(HDU)-ACMSteps-Chapter Three-《FatMouse&#39; Trade》《今年暑假不AC》《排名》《开门人和关门人》

http://acm.hdu.edu.cn/game/entry/problem/list.php?chapterid=1§ionid=3 1.3.1 FatMouse' Trade #include <algorithm> /* 题意:价值/代价的比值来排序,买比值大的. Sample Input 5 3 7 2 4 3 5 2 20 3 25 18 24 15 15 10 -1 -1 Sample Output 13.333 31.500 */ #include<stdio.h>

【转】对于杭电OJ题目的分类

[好像博客园不能直接转载,所以我复制过来了..] 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze 广度搜索1006 Redraiment猜想 数论:容斥定理1007 童年生活二三事 递推题1008 University 简单hash1009 目标柏林 简单模拟题1010 Rails 模拟题(堆栈)1011 Box of Bricks 简单题1012 IMMEDI

杭电 OJ 提交代码需要注意的问题

杭电acm 提交代码需要注意的问题 1. 用 Java 的时候类名请用 Main 2. Java 提交出现 PE 的可能原因有 1) 最基本的错误是空格问题,比如注意每行的末尾是否输出空格 2) 用 Java 提交的时候需要注意换行是用的什么方法输出的,如果用 System.out.printf() 这个格式化输出,请使用 %n 或者 \r\n 作为转义符,而不要用 \n,也可以用 System.out.println() 输出换行 3. 对包含比较精确的数字计算最好使用 C/C++ 语言,对于

杭电oj 1009 FatMouse&#39; Trade

Tips:本题采用贪心算法,类似于背包问题,关键在于读入数据之后,将数据按 J[i]/F[i] 从大到小排列即可. 1 /**本程序主要采用贪心算法思想,类似于背包问题*/ 2 #include<stdio.h> 3 #include<string.h> 4 int main() 5 { 6 int M,N; 7 while(scanf("%d %d",&M,&N)) 8 { 9 if(M == -1 && N == -1) 10