Codeforce Round #545(Div2)

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;
}
posted @ 2019-03-26 20:04  codeoos  阅读(168)  评论(0编辑  收藏  举报