刷題——hdu 6168 Numbers

/*
將ab數組放入map中記錄,將ab數組排序
ab[0],ab[1]一定是a1,a2(毫無疑問的)
接下去不知道是a1+a2,還是a3,在map中將a1+a2去掉1
ab序列在map中查找,頭一個數若個數不爲0就是a3(a1,a2,a1+a2)已去掉1
同理將a1+a3,a2+a3去掉後頭一個個數不爲0的數就是a3
依次操作,就求出a數組
*/
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <map>
using namespace std;
int ab[125300];
int a[125300];
int n,m,l;
int main(){
    while(~scanf("%d",&m)){
        n=(int)sqrt(m*2*1.0);
        map<int,int>s;
        for(int i=0;i<m;i++){
            scanf("%d",&ab[i]);
            s[ab[i]]++;
        }
        sort(ab,ab+m);//不排序也A了
        l=0;
        for(int i=0;i<m;i++){
            if(s[ab[i]]>0){
                for(int j=0;j<l;j++){
                    s[ab[i]+a[j]]--;
                }
                a[l++]=ab[i];
                s[ab[i]]--;
                if(l==n)break;
            }
        }
        printf("%d\n",n);
        for(int i=0;i<n;i++){
            if(i)printf(" ");
            printf("%d",a[i]);
        }
        printf("\n");
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章