codeforces#238_div2_D Toy Sum

来源:互联网 发布:sqlserver免费吗 编辑:程序博客网 时间:2024/06/04 17:46

题目地址:cf#238_div2_D

思路:

利用对称的思想,配对

1-s ,2-(s-1),3-(s-2).....k-(s-k+1)  

如果两个都在已经选择的集合里面, 就找一组和为s+1 ,都没有选的加入Y 集合

但是只能加入一组,所以引进来done数组,代表是否已被处理

int l=1;要放在最外面,否则会超时,本来之前考虑过的都不用再考虑了。

代码:

#include<iostream>#include<cstdio>#include<vector>#include<cstring>using namespace std;const int s=1000000;int b[s+5];int p[s+5];int done[s+5];int main(){    int n;    cin>>n;            memset(b, 0, sizeof(b));        memset(done, 0, sizeof(done));    vector<int>  ans;        int temp;    for(int i=0;i<n;i++)    {        scanf("%d",&temp);        b[temp]=1;        p[i]=temp;            }              int l=1;        for(int i=0;i<n;i++)    {       if(done[p[i]]==0)       {       if(b[s-p[i]+1]==0)       {           ans.push_back(s-p[i]+1);           b[s-p[i]+1]=1;       }               else       {                      while(b[l]||b[s-l+1])           {               l++;           }                      ans.push_back(l);           b[l]=1;           ans.push_back(s-l+1);           b[s-l+1]=1;                      done[s-p[i]+1]=1;       }    }            }    cout<<ans.size()<<endl;            for(int i=0;i<ans.size();i++)          {        if(i) printf(" ");                printf("%d",ans[i]);                }        }



0 0