前m大的數
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 15953 Accepted Submission(s): 5450
給定一個包含N(N<=3000)個正整數的序列,每個數不超過5000,對它們兩兩相加得到的N*(N-1)/2個和,求出其中前M大的數(M<=1000)並按從大到小的順序排列。
第一行兩個數N和M,
第二行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;
}