Codeforces Round 554 (Div.2)
A.奇数配偶数。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #define rep(i,l,r) for (int i=(l); i<=(r); i++) 6 typedef long long ll; 7 using namespace std; 8 9 int n,m,x,s1,s2; 10 11 int main(){ 12 scanf("%d%d",&n,&m); 13 rep(i,1,n) scanf("%d",&x),s1+=x&1; 14 rep(i,1,m) scanf("%d",&x),s2+=x&1; 15 printf("%d ",min(s1,m-s2)+min(s2,n-s1)); 16 return 0; 17 }
B.每次将二进制最高位异或掉,实时判断是否符合条件即可。由于数最多有20位所以总操作次数显然不会超过40。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define rep(i,l,r) for (int i=(l); i<=(r); i++) 5 using namespace std; 6 7 int x,s[50],t[50],a[45],ans,cnt; 8 9 void work(int x){ 10 int tmp=x; cnt=0; 11 while (tmp) t[++cnt]=tmp&1,tmp>>=1; 12 } 13 14 bool pd(int x){ 15 rep(i,0,30) if (x==s[i]-1) return 1; 16 return 0; 17 } 18 19 int main(){ 20 scanf("%d",&x); s[0]=1; 21 rep(i,1,30) s[i]=1<<i; 22 work(x); int flag=0; 23 for(int i=cnt; i; i--){ 24 if (!t[i]){ 25 x^=(s[i]-1); 26 if (pd(x)){ a[++ans]=i; flag=1; break; } 27 x++; a[++ans]=i; memset(t,0,sizeof(t)); work(x); 28 } 29 } 30 printf("%d ",ans*2-flag); 31 rep(i,1,ans) printf("%d ",a[i]); 32 return 0; 33 }