B.一开始用贪心做,后来贪着贪着分情况乱了emmm,崩了
然后根据两个方程和四个未知数,枚举两个未知数,求方程组的解
注意解尊在的条件(范围),以及枚举的未知数是否合适(算其他未知数的时候最好不要)出现除一个数,否则出现不能整除的情况会发生错误
1 #include<bits/stdc++.h> 2 #define pii pair<int,int> 3 using namespace std; 4 const int maxn=5e3+5; 5 struct node 6 { 7 int id,first,second; 8 }art[maxn]; 9 int n; 10 map<pii,int>m; 11 bool cmp(node a,node b) 12 { 13 int sa=a.first+a.second,sb=b.first+b.second; 14 if(sa==1 && sb==1) return a.first<b.first; 15 return sa<sb; 16 } 17 int main() 18 { 19 cin>>n;string t,tt;cin>>t>>tt; 20 m[{0,1}]=0,m[{1,1}]=0,m[{1,0}]=0,m[{0,0}]=0; 21 for(int i=1;i<=n;++i) 22 { 23 art[i].first=t[i-1]-'0'; 24 art[i].second=tt[i-1]-'0'; 25 ++m[{art[i].first,art[i].second}]; 26 art[i].id=i; 27 } 28 sort(art+1,art+1+n,cmp); 29 //cout<<endl; 30 static int s00,s11,s01,s10; s00=s11=s01=s10=-1; 31 for(int i=1;i<=n;++i) 32 { 33 if(s00<0 && art[i].first==0 && art[i].second==0) s00=i; 34 if(s01<0 && art[i].first==0 && art[i].second==1) s01=i; 35 if(s10<0 && art[i].first==1 && art[i].second==0) s10=i; 36 if(s11<0 && art[i].first==1 && art[i].second==1) s11=i; 37 } 38 int na=m[{0,0}],nb=m[{0,1}],nc=m[{1,0}],nd=m[{1,1}]; 39 /* 40 for(int a=0;a<=na;++a) 41 { 42 for(int d=0;d<=nd;++d) 43 { 44 if(a-d==n/2-nd-nb) 45 { 46 int b=(nb+nd-2*d)/2; //最开始的时候枚举a,d求b,c 但是这里会出现一个问题,就是b=(......)/2,如果(......)是奇数,机会出现错误,所以换了枚举方式 47 int c=n/2-a-b-d; 48 if(b<0 || c<0 || b>nb || c>nc) continue; 49 if(a)for(int i=s00,j=1;j<=a;++j,++i) cout<<art[i].id<<" "; 50 if(b)for(int i=s01,j=1;j<=b;++j,++i) cout<<art[i].id<<" "; 51 if(c)for(int i=s10,j=1;j<=c;++j,++i) cout<<art[i].id<<" "; 52 if(d)for(int i=s11,j=1;j<=d;++j,++i) cout<<art[i].id<<" "; 53 return 0; 54 } 55 } 56 }*/ 57 for(int b=0;b<=nb;++b) 58 { 59 for(int d=0;d<=nd;++d) 60 { 61 int c=nb+nd-b-2*d; 62 int a=n/2-b-c-d; //先把a,c算出来,再带入式子看看对不对,注意带进去的式子,不能是恒等式,如果是恒等式,肯定是错的(原因不赘述) 63 if(a-d==n/2-nb-nd) 64 { 65 if(a<0 || c<0 || a>na || c>nc) continue; 66 if(a)for(int i=s00,j=1;j<=a;++j,++i) cout<<art[i].id<<" "; 67 if(b)for(int i=s01,j=1;j<=b;++j,++i) cout<<art[i].id<<" "; 68 if(c)for(int i=s10,j=1;j<=c;++j,++i) cout<<art[i].id<<" "; 69 if(d)for(int i=s11,j=1;j<=d;++j,++i) cout<<art[i].id<<" "; 70 return 0; 71 } 72 } 73 } 74 cout<<-1;return 0; 75 }
#include<bits/stdc++.h>
#definepii pair<int,int>
using namespace std;
const int maxn=5e3+5;
struct node
{
int id,first,second;
}art[maxn];
int n;
map<pii,int>m;
bool cmp(node a,node b)
{
int sa=a.first+a.second,sb=b.first+b.second;
if(sa==1 && sb==1) return a.first<b.first;
return sa<sb;
}
int main()
{
cin>>n;string t,tt;cin>>t>>tt;
m[{0,1}]=0,m[{1,1}]=0,m[{1,0}]=0,m[{0,0}]=0;
for(int i=1;i<=n;++i)
{
art[i].first=t[i-1]-'0';
art[i].second=tt[i-1]-'0';
++m[{art[i].first,art[i].second}];
art[i].id=i;
}
sort(art+1,art+1+n,cmp);
//cout<<endl;
static int s00,s11,s01,s10; s00=s11=s01=s10=-1;
for(int i=1;i<=n;++i)
{
if(s00<0 && art[i].first==0 && art[i].second==0) s00=i;
if(s01<0 && art[i].first==0 && art[i].second==1) s01=i;
if(s10<0 && art[i].first==1 && art[i].second==0) s10=i;
if(s11<0 && art[i].first==1 && art[i].second==1) s11=i;
}
int na=m[{0,0}],nb=m[{0,1}],nc=m[{1,0}],nd=m[{1,1}];
/*
for(int a=0;a<=na;++a)
{
for(int d=0;d<=nd;++d)
{
if(a-d==n/2-nd-nb)
{
int b=(nb+nd-2*d)/2; //最开始的时候枚举a,d求b,c 但是这里会出现一个问题,就是b=(......)/2,如果(......)是奇数,机会出现错误,所以换了枚举方式
int c=n/2-a-b-d;
if(b<0 || c<0 || b>nb || c>nc) continue;
if(a)for(int i=s00,j=1;j<=a;++j,++i) cout<<art[i].id<<" ";
if(b)for(int i=s01,j=1;j<=b;++j,++i) cout<<art[i].id<<" ";
if(c)for(int i=s10,j=1;j<=c;++j,++i) cout<<art[i].id<<" ";
if(d)for(int i=s11,j=1;j<=d;++j,++i) cout<<art[i].id<<" ";
return 0;
}
}
}*/
for(int b=0;b<=nb;++b)
{
for(int d=0;d<=nd;++d)
{
int c=nb+nd-b-2*d;
int a=n/2-b-c-d; //先把a,c算出来,再带入式子看看对不对,注意带进去的式子,不能是恒等式,如果是恒等式,肯定是错的(原因不赘述)
if(a-d==n/2-nb-nd)
{
if(a<0 || c<0 || a>na || c>nc) continue;
if(a)for(int i=s00,j=1;j<=a;++j,++i) cout<<art[i].id<<" ";
if(b)for(int i=s01,j=1;j<=b;++j,++i) cout<<art[i].id<<" ";
if(c)for(int i=s10,j=1;j<=c;++j,++i) cout<<art[i].id<<" ";
if(d)for(int i=s11,j=1;j<=d;++j,++i) cout<<art[i].id<<" ";
return 0;
}
}
}
cout<<-1;return 0;
}