【题目链接】
http://acm.hdu.edu.cn/showproblem.php?pid=6168
题目意思
有一个长度为n的a数组,由a数组任意两项相加的和得到b数组,现在a,b数组混合起来了,给你混合的m个元素。求原本的a数组长度和原本a数组的元素。
解题思路
由于b数组是由a数组相加得到的,所以最小两项一定是a数组,把混合数列去除a[1],a[2]和a[1]+a[2],接着加入第3小项,去除a[3],a[3]+a[1],a[3]+a[2]。不断跑下去就可以了。
代码部分
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int maxn=125255;
int a[maxn],b[maxn]; ///b数组存储原数组,a数组存储混合数组
int main()
{
int m,n;
while(scanf("%d",&m)!=EOF)
{
map <int,int>M; ///用map计算混合数组中某元素是否删除
for (int i=0; i<m; i++)
{
scanf("%d",&a[i]);
M[a[i]]++;
}
sort(a,a+m); ///排序
n=(sqrt(8*m+1)-1)/2; ///原数组个数
cout<<n<<endl;
b[0]=a[0];
M[a[0]]--;
for (int i=1,j=1; i<m; i++)
{
if (M[a[i]]>0) ///如果第i大还在为删除加入原数组
{
b[j++]=a[i];
M[a[i]]--;
for (int k=0; k<j-1; k++) ///扣除相应和产生的b数组元素
{
M[b[k]+a[i]]--;
}
}
if (j==n)
break;
}
for (int i=0;i<n;i++)
{
printf("%d%c",b[i],i==n-1?'\n':' ');
}
}
}