题意:
给两个长度为n(n为偶数)的01字符串 A, B
要求把1-n分均为两份,要求第一份里ai的和等于第二份里bi的和,
思路:
aibi有四种可能:01,10,00,11
建四个队列,分别入队,
然后根据01,10个数将11队列出队分配给01,10队列,
然后再判断当前01,10个数,把多的那一个多出来的分到另一个新的队列里(001或010),
当01,10队列元素个数相同时,他们的和相等,
然后再把刚才取出的队列元素全部出队入队到他原来队列的相反队列中,
然后根据10,01队列元素个数分配00队列
判断01,10队列元素个数是否相等不相等-1,
代码:
#include<cstring> #include<iostream> #include<cstdlib> #include<cstdio> #include<algorithm> #include<queue> #include<stack> using namespace std; int t; char nn[5009],n[5009]; int ans=-1,pos=1; int n01,n00,n10,n11; int a[5009]; queue<int>q11,q01,q10,q00,q001,q010; int main(){ cin>>t; for(int i=1;i<=t;i++){ scanf(" %c",&n[i]); } for(int i=1;i<=t;i++){ scanf(" %c",&nn[i]); if(nn[i]=='1'){ if(n[i]=='1')q11.push(i); else q01.push(i); } else if(n[i]=='1')q10.push(i); else q00.push(i); } n01=q01.size(); n10=q10.size(); while(!q11.empty()){//11 int k=q11.front(); q11.pop(); if(q01.size()>=q10.size()) q10.push(k); else if(q01.size()<q10.size())q01.push(k); } if(q01.size()>q10.size()){ while(q01.size()>q10.size()){ n01--; if(n01<0){cout<<-1<<endl;return 0;} int k=q01.front(); q01.pop(); q010.push(k); } } else { while(q10.size()>q01.size()){ n10--; if(n10<0){cout<<-1<<endl;return 0;} int k=q10.front(); q10.pop(); q001.push(k); } } while(!q010.empty()){ int o=q010.front(); q010.pop(); q10.push(o); } while(!q001.empty()){ int o=q001.front(); q001.pop(); q01.push(o); } while(!q00.empty()){ int k=q00.front(); q00.pop(); if(q01.size()>q10.size()) q10.push(k); else q01.push(k); } if(q01.size()!=q10.size()){cout<<-1<<endl;return 0;} cout<<q10.front(); q10.pop(); while(!q10.empty()){ cout<<' '<<q10.front(); q10.pop(); } cout<<endl; }
吐槽:这个题写死我了,写了三个小时,一开始打完一百多行,然后删了重写,最后debug半天发现q01写错q10..代码能力还是不行