前m大的數
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10382 Accepted Submission(s): 3614
給定一個包含N(N<=3000)個正整數的序列,每個數不超過5000,對它們兩兩相加得到的N*(N-1)/2個和,求出其中前M大的數(M<=1000)並按從大到小的順序排列。
第一行兩個數N和M,
第二行N個數,表示該序列。
<span style="font-size:18px;"><span style="font-size:24px;"></span>
<span style="font-size:18px;">#include <iostream></span>
<span style="font-size:18px;">#include<algorithm>
using namespace std;
int a[3005],s[10000];
int cmp(int a,int b)
{
return a>b;
}
int main()
{
int n,m,i,j;
while(~scanf("%d%d",&n,&m))
{
memset(s,0,sizeof(s));
for(i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n,cmp);
int t=0,p=0;
if(n>100)
t=100;
else
t=n;
for(i=0;i<t;i++)
for(j=i+1;j<t;j++)
s[p++]=a[i]+a[j];
sort(s,s+p,cmp);
for(i=0;i<m-1;i++)
cout<<s[i]<<" ";
cout<<s[i]<<endl;
}
return 0;
}
</span></span>
AC代碼(二):用優先隊列做的
<span style="font-size:18px;">#include<iostream>
#include<queue>
#include<cstdio>
using namespace std;
int a[3005];
int main()
{
priority_queue<int>q;
int i,j,n,m;
while(~scanf("%d%d",&n,&m))
{
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
q.push(a[i]+a[j]);
for(i=0;i<m-1;i++)
{
printf("%d ",q.top());
q.pop();
}
printf("%d\n",q.top());
}
return 0;
}
</span>