前mの大きい数(hdu 1280)

5258 ワード

前mの大きい数
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7945    Accepted Submission(s): 2831
Problem Description
Gardonが希ちゃんに出した宿題を覚えていますか?(前回の試合の1005)実は希ちゃんは元の時計を取り戻して、今彼女は彼女の答えが正しいかどうかを確認したいと思っていますが、全体の答えは巨大な時計で、希ちゃんはあなたに答えの中で最大のM個の数を彼女に伝えたいだけです.
N(N<=3000)個の正の整数を含むシーケンスが与えられ、各数は5000を超えず、それらの2つを加算して得られたN*(N−1)/2個の和に対して、前のMの大きい数(M<=1000)を求め、大きい順から小さい順に並べられる.
 
Input
入力には複数のデータが含まれる場合があり、各データは2つの行を含む:最初の行の2つの数NとM、
2行目のN個の数は、そのシーケンスを表す.
 
Output
入力されたデータのセットごとに、M個の数が出力され、結果が表示されます.出力は大きい順から小さい順に並べなければならない.
 
Sample Input
4 4
1 2 3 4
4 5
5 3 6 4
 
Sample Output
7 6 5 5
11 10 9 9 8
 
#include<cstdio>

#include<algorithm>

#include<iostream>

using namespace std;



int a[4500005];//   0,WA N 。。。。。  



bool compare(int a,int b)

{

      return a>b;   //

}

int main()

{

    int b[3005];

    int x,y,i,j,t,m;

    while(scanf("%d%d",&x,&y)!=EOF)

    {

        memset(b,0,sizeof(b));

        memset(a,0,sizeof(a));

        m=x*(x-1)/2;

        for(i=0;i<x;i++)

            scanf("%d",&b[i]);

        t=0;

        for(i=0;i<x-1;i++)

            for(j=i+1;j<x;j++)

                a[t++]=b[i]+b[j];

        sort(a,a+m,compare);

        for(i=0;i<y-1;i++)

            printf("%d ",a[i]);

        printf("%d
",a[i]); } return 0; } /* # include<stdio.h> # include<string> int main() { int n,m,i,j,hash[10001],a[3001],flag; while(scanf("%d%d",&n,&m)==2) { flag = 1; memset(hash,0,sizeof(hash)); for(i=0;i<n;i++) scanf("%d",&a[i]); for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) hash[a[i]+a[j]]++; for(i=10000;i>=0;i--) { while(hash[i]--) { if(flag) { printf("%d",i); flag = 0; } else printf(" %d",i); m--; if(!m) break; } if(!m) break; } printf("
"); } return 0; }
*/

1つ目の方法は直接的ですが、使うことが多いので、2つ目の方法をお勧めします.簡潔明瞭です!!!