HUT 排序训练赛 E - 前m大的数

Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u

[]   [Go Back]   [Status]  

Description

还记得Gardon给小希布置的那个作业么?(上次比赛的1005)其实小希已经找回了原来的那张数表,现在她想确认一下她的答案是否正确,但是整个的答案是很庞大的表,小希只想让你把答案中最大的M个数告诉她就可以了。
给定一个包含N(N<=3000)个正整数的序列,每个数不超过5000,对它们两两相加得到的N*(N-1)/2个和,求出其中前M大的数(M<=1000)并按从大到小的顺序排列。
 

Input

输入可能包含多组数据,其中每组数据包括两行:
第一行两个数N和M,
第二行N个数,表示该序列。

 

Output

对于输入的每组数据,输出M个数,表示结果。输出应当按照从大到小的顺序排列。
 

Sample Input

4 4 1 2 3 4 4 5 5 3 6 4
 

Sample Output

7 6 5 5 11 10 9 9 8
 

Source

杭电ACM集训队训练赛(VI)

【题目来源】

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=41455#problem/E

【题目大意】

首先,第一行两个数N和M(M表示所要输出的前M大的数,N表示输入的数的个数), 第二行N个数,表示该序列。

输出:输出M个数,表示结果。输出应当按照从大到小的顺序排列。(注意是从大到小,刚开始搞反了)

【题目解析】

首先定义两个数组,一个存储输入的序列,一个存储计算后的序列(这个要开大一些,反正不爆就可),然后就是计算,使用两个嵌套的for语句就可,然后就是排序、输出,排序时不要用冒泡==、否则会TLE,最好用快排。

下面是我AC的代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int a[3005],b[5000000];
int main()
{
    int m,n,i,j,t;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        t=0;
        for(i=0;i<m;i++)
        scanf("%d",&a[i]);
        for(i=0;i<m;i++)
        {
            for(j=i+1;j<m;j++)
            {
                b[t++]=a[i]+a[j];
            }
        }
        sort(b,b+t);
        for(i=t-1;i>t-1-n;i--)
        {
            if(i==t-1) printf("%d",b[i]);
            else printf(" %d",b[i]);
        }
        printf("\n");
    }
   return 0;
}

 

你可能感兴趣的:(排序)