您的位置:首页 > 其它

codeforces 405 d toy sum

2014-04-22 22:41 295 查看
题意:1-10^6中,挑出n个数,求出这n个数-1相加的和。现在要找另外的数,使得每个数与10^6相减的和与之前的和相等。

这个题真的很无语,开始分析得出结果是,将一个数分解为k个数,这k个数中不能出现之前的n个数。然后深搜,dp什么的那方向想。

然后发现,每个数只能出现一次,那么在数组中看起来就是对称的。也就是说,一个数和另一个数相加的和为10^6+1。

如果两个数中有一个出现在n中,那么另一个数就是答案。两个数都出现在n中,那么寻找另一对和为10^6+1的即可。

#include <cstdio>
#include <cstring>
const int N = 1000001;
struct Node
{
int x;
int flag;
};
Node a
;
int ok
;
int ans
;
int main()
{
int n;
while(~scanf("%d",&n))
{
int k=0;
memset(ok,0,sizeof(ok));
memset(ans,0,sizeof(ans));
for(int i=0; i<n; i++)
{
scanf("%d",&a[i].x);
ok[a[i].x]=1;
if(ok[N-a[i].x]==1)
a[i].flag=1;
else
a[i].flag=0;
}
int cc=1;
for(int i=0; i<n; i++)
{
int tmp=N-a[i].x;
if(a[i].flag==1)
continue;
if(ok[tmp]==0)
{
ans[k++]=tmp;
ok[tmp]=1;
}
else
{
for(int j=cc; j<=N/2; j++)
{
if(ok[j]==0 && ok[N-j]==0)
{
ans[k++]=j;
ans[k++]=N-j;
ok[j]=1;
ok[N-j]=1;
cc=j;
break;
}
}
}
}
printf("%d\n",k);
for(int i=0; i<k-1; i++)
{
printf("%d ",ans[i]);
}
printf("%d\n",ans[k-1]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: