codeforces#238_div2_D Toy Sum
题目地址: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]); } }
posted on 2014-03-25 21:31 814jingqi的ACM 阅读(121) 评论(0) 编辑 收藏 举报