C

来源:互联网 发布:大宗交易 知乎 编辑:程序博客网 时间:2024/05/15 12:03

点击打开链接



还记得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




我的答案


#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
bool cmp(int a,int b)
{
return a > b;
}
int main()
{
int num[3010],sum[100000];
int n,m;
    while(~scanf("%d%d",&n,&m)) 
{

for(int i=1;i<=n;i++)


scanf("%d",&num[i]);//一个空格引起的悲剧 直接给数组赋值 

int q=1;
for(int f=1; f<=n; f++)
{

  for(int g=1+f;g<=n; g++)//g=1+f 
  {
  
  sum[q]=num[f]+num[g];
  q++;
}
}
sort(sum+1,sum+q+1,cmp);
for(int w=1;w<=m;w++)
printf("%d ",sum[w]);




}
return 0;
}


参考答案


#include<cstdio>  
#include<cstring>  
#include<algorithm>  
using namespace std;  
bool cmp(int a,int b)  
{  
    return a>b;  
}  
int c[5000000];  
int main()  
{  
    int n,m;  
    int a[3010];  
    while(~scanf("%d%d",&n,&m))  
    {  
        for(int i=1;i<=n;i++)  
            scanf("%d",&a[i]);  
        int num=1,ant=1;  
        for(int i=1;i<=n;i++)  
        {  
            for(int j=i+1;j<=n;j++)          //这个地方用j=i+1比较好   
            {  
                c[num]=a[i]+a[j];               //c[num]存两两相加的值         数组之间的运算
                num++;  
            }  
        }  
        sort(c+1,c+num+1,cmp);  
        for(int i=1;i<m;i++)  
            printf("%d ",c[i]);  
        printf("%d\n",c[m]);  
    }  
    return 0;  
}