您的位置:首页 > 其它

刷题——hdu 6168 Numbers

2017-08-22 19:45 393 查看
/*

将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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: