• ACM_排序


    除了sort,你还会什么

    Time Limit: 1000/500ms (Java/Others)

    Problem Description:

    给出若干人的年龄(1~100之间的整数),把它们按照从小到大的顺序输出。

    Input:

    输入包含多组测试数据。每组数据的第一行为一整数 n,(0<n<=2 000 000),即居民总数;下一行输入 n 个整数,表示各居民的年龄。(输入文件约有20 MB,而内存限制只有2 MB,除了sort(),你还会什么...)

    Output:

    对于每一组数据,按照从小到大的顺序输出各居民的年龄。相邻年龄用空格隔开。

    Sample Input:

    3
    56 56 56
    5
    99 91 89 63 91

    Sample Output:

    56 56 56 
    63 89 91 91 99 
    解题思路:题目中给出n的最大值为2*10^6,也就是直接调用sort函数的话,会超时,因为其时间复杂度是O(nlogn),但是给出的年龄范围只有1~100,相对n来说很小,也就是说我们可以利用一个数组来存相同年龄的人数,然后从1~100顺序遍历输出即可,注意要用C语言的输入输出,不然会超时!!!
    AC代码:
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int main()
     4 {
     5     int n,x,a[101];
     6     while(~scanf("%d",&n)){
     7         memset(a,0,sizeof(a));
     8         for(int i=1;i<=n;++i){
     9             scanf("%d",&x);a[x]++;
    10         }
    11         for(int i=1,m=0;i<=100;++i){
    12             for(int j=1;j<=a[i];++j){
    13                 ++m;printf("%d%s",i,m<n?" ":"
    ");
    14             }
    15         }
    16     }
    17     return 0;
    18 }

     也可以使用优先队列:这里了解一下:priority_queue<Type, Container, Functional>Type为数据类型, Container为保存数据的容器,Functional为元素比较方式。如果不写后两个参数,那么容器默认用的是vector,比较方式默认用operator>,也就是优先队列是大顶堆,队头元素最大。

    AC代码:注意输入输出要用C语言格式,不然真的会超时QAQ。。。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int main()
     4 {
     5     int n,x;
     6     priority_queue<int,vector<int>,greater<int> > q;
     7     while(~scanf("%d",&n)){
     8         while(n--){scanf("%d",&x);q.push(x);}
     9         while(q.size()>1){
    10             printf("%d ",q.top());q.pop();
    11         }
    12         printf("%d
    ",q.top());q.pop();
    13     }
    14     return 0;
    15 }
  • 相关阅读:
    javascript中获取dom元素高度和宽度
    $.ajax()方法详解
    JQ中$(window).load和$(document).ready区别与执行顺序
    第几个幸运数
    乘积尾零
    星期一
    分数
    卡片换位
    冰雹数
    打印方格
  • 原文地址:https://www.cnblogs.com/acgoto/p/9010217.html
Copyright © 2020-2023  润新知