HDU 1280 前m大的数 基数排序
http://acm.hdu.edu.cn/showproblem.php?pid=1280
题目大意:
给你N(N<=3000)个数(这些数不超过5000),要求输出他们两两相加后和最大的M(M<=1000)个数。(并且这M个数从大到小排序)
思路:
数的范围有限所以进行基数排序。
输出的时候从大到小扫描凑足M个即可。
#include<cstdio> const int MAXN=10000+2; int data[3001]; int main() { int n,m; while(~scanf("%d%d",&n,&m)) { int sum[MAXN]={0}; for(int i=0;i<n;i++) { scanf("%d",&data[i]); sum[ data[i] ]++; } for(int i=0;i<n;i++) for(int j=i+1;j<n;j++) sum[ data[i]+data[j] ]++; int len=0; bool first=true; for(int i=MAXN-1;len<m;i--) { while(sum[i]!=0 && len<m) { sum[i]--; if(first) printf("%d",i); else printf(" %d",i); len++; first=false; } } printf("\n"); } return 0; }
新 blog : www.hrwhisper.me