最开始的思路是: 最大的和肯定由原始序列种最大的前K个数两两组合产生,由于M <= 1000, 所以输入序列中的前50个数就够用了(50*49/2 = 1225 > 1000)。 然后用两次stl里的排序就能求出最大的M个数了,不知道为啥一直WA。 只好写了个counting sort AC了。
方法一: 计数排序
/*
PROG: 前M大的数
LANG: C++11
*/
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdlib>
#include <climits>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <utility>
#include <deque>
#include <set>
#include <map>
#include <iostream>
#include <fstream>
#include <algorithm>
#include <time.h>
using namespace std;
#define mst(a,b) memset(a,b,sizeof(a))
typedef long long ll;
const int N = 100010;
const ll MOD = 1000000007;
const int INF = 0x7fffffff;
int a[3005];
int res[10005];
bool cmp(int x, int y){
return x > y;
}
int main()
{
int n, m, i, j;
while(scanf("%d%d", &n, &m) != EOF){
mst(a,0);
mst(res,0);
for(i = 0; i < n; i++){
scanf("%d", &a[i]);
}
for(i = 0; i < n-1; i++){
for(j = i+1; j < n; j++){
res[a[i]+ a[j]]++;
}
}
for(i = 10000; i >= 0; i--){
while(res[i] != 0){
if(m == 1){
cout << i << endl;
i = -1;
break;
}
else{
cout << i << " ";
res[i]--;
m--;
}
}
}
}
return 0;
}
方法二: 自己的case能过,一直WA, 谁看出bug了麻烦留个言哈
/*
PROG: 前M大的数
LANG: C++11
*/
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdlib>
#include <climits>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <utility>
#include <deque>
#include <set>
#include <map>
#include <iostream>
#include <fstream>
#include <algorithm>
#include <time.h>
using namespace std;
#define mst(a,b) memset(a,b,sizeof(a))
typedef long long ll;
const int N = 100010;
const ll MOD = 1000000007;
const int INF = 0x7fffffff;
int a[3005];
int res[10005];
bool cmp(int x, int y){
return x > y;
}
int main()
{
int n, m, i, j;
while(scanf("%d%d", &n, &m) != EOF){
mst(a,0);
mst(res,0);
for(i = 0; i < n; i++){
scanf("%d", &a[i]);
}
sort(a, a+n, cmp);
int k = min(50, n);
int index = 0;
for(i = 0; i < k-1; i++){
for(j = i+1; j < k; j++){
res[index++] = a[i] + a[j];
}
}
sort(res, res+k*(k-1)/2, cmp);
for(i = 0; i < m-1; i++)
cout << res[i] << " ";
cout << res[m-1] << endl;
}
return 0;
}