hdu 1280 앞 m 큰 수 (배열 아래 표 시 된 정렬)

2351 단어 HDU1280hdu1280
앞 m 큰 수
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13442    Accepted Submission(s): 4588
Problem Description
Gardon 이 샤 오 쉬 에 게 내 준 그 숙제 기억 나 세 요?(지난번 경기 의 1005) 사실 소 희 는 원래 의 그 시 계 를 되 찾 았 다. 지금 은 그녀의 답 이 정확 한 지 확인 하고 싶 지만 전체 답 은 매우 큰 시계 이다. 소 희 는 네가 답 에서 가장 큰 M 개 수 를 그녀 에 게 알려 주 고 싶 을 뿐이다. 
N (N < = 3000) 개의 정 수 를 포함 하 는 서열 을 지정 합 니 다. 각 수 는 5000 을 초과 하지 않 고 두 개 를 더 한 N * (N - 1) / 2 개 와 그 중에서 앞의 M 큰 수 (M < = 1000) 를 구하 고 큰 것 에서 작은 것 으로 배열 합 니 다.
 
Input
입력 은 여러 그룹의 데 이 터 를 포함 할 수 있 습 니 다. 그 중에서 각 그룹의 데 이 터 는 두 줄 을 포함 합 니 다. 
첫 번 째 줄 은 N 과 M 입 니 다. 
두 번 째 줄 의 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

 
Author
Gardon
 
Source
항 저 우 전기 ACM 합숙 훈련 대 훈련 경기 (VI)
 
남 들 이 어떻게 하 는 지 모 르 겠 어 요.다른 사람 보면 sort 다 살 수 있 을 것 같은 데...
#include <stdio.h>
#include <string.h>
#define inf 0x3fffffff
int a[10005]={0},b[3005];
int main()
{
    int n,m,max;
    while(scanf("%d %d",&m,&n)!=EOF)
    {
    	max=-inf;//      
        for(int i=0;i<m;i++)
        {
        	scanf("%d",&b[i]),a[b[i]]++;
        	if(b[i]>max)
        	max=b[i];
    	}
        for(int i=0;i<m;i++)
        for(int j=i+1;j<m;j++)
        {
			a[b[i]+b[j]]++;
			if(b[i]+b[j]>max)
			max=b[i]+b[j];
    	}
    	int j;
		for(j=max;j>=0;j--)//  ~
        {
        	if(a[j])
        	{
        		printf("%d",j),a[j]--;
        		break;
        	}
		}
		n--;
		for(int i=j;i>=0;i--)
        {
        	if(a[i])
        	{
        		while(a[i]&&n)
        		printf(" %d",i),a[i]--,n--;
        	}
        	if(n==0)
        	break;
		}
		printf("
"); max=-inf; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); } return 0; }

좋은 웹페이지 즐겨찾기