前m大的数(HDU_1280) 计数排序

来源:互联网 发布:知乎 女生 打男朋友 编辑:程序博客网 时间:2024/05/17 16:44

前m大的数

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 15953    Accepted Submission(s): 5450


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

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

 

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

Sample Input
4 41 2 3 44 55 3 6 4
 

Sample Output
7 6 5 511 10 9 9 8
 

Author
Gardon


题目大意:按从大到小输出n个数两数自和;

解题思路:计数排序。

#include"iostream"#include"cstdio"#include"cstring"using namespace std;const int maxn = 10005;int cnt[maxn];int num[3005];int max(int x, int y){return x > y ? x : y;}int main(){int n, k, t, max_sum;while(scanf("%d%d", &n, &k) != EOF){memset(cnt, 0, sizeof cnt);max_sum = 0;for(int i = 1;i <= n;i ++)scanf("%d", &num[i]);//if(k == 0) continue;for(int i = 1;i <= n-1;i ++)for(int j = i+1;j <= n;j ++){t = num[i] + num[j];cnt[t] ++;max_sum = max(t, max_sum);}int r = max_sum, f = 0;while(k){while(cnt[r]&&k){if(f == 0) printf("%d", r);else printf(" %d", r);f = 1;cnt[r] --;k --;}r --;}printf("\n");}return 0;}



0 0
原创粉丝点击