Description
Input
Output
Sample Input
6 3 1 0 0 1 0 1 1 3 2
Sample Output
1这题就是一道贪心+模拟题。AC代码1:#include<iostream> #include<algorithm> #include<cstring> #include<string> #include<cstdio> #include<vector> using namespace std; #define T 150 typedef long long ll; int tar1[T],tar2[T],k,n,m; int MoveBit(int i,int f,int tar[]) { int c = 0,j; for(j=i+1;j<n;++j){ if(f==tar[j]){ c = j-i; tar[j] = tar[i]; tar[i] = f; break; } } return c; } int main() { #ifdef zsc freopen("input.txt","r",stdin); #endif // zsc int i,j; int b[T]; int one,zero,c,mi,bit,sum; while(~scanf("%d%d",&n,&m)) { one = zero = 0;c=0; for(i=0;i<n;++i){ scanf("%d",&tar1[i]); tar2[i]=tar1[i]; if(tar1[i])one++; else zero++; } for(i=0,sum=0;i<m;++i){ scanf("%d",&b[i]); if(i%2==0)sum+=b[i]; } mi = 0x3f3f3f3f; if(sum==one){ c=0;bit = 1; for(i=0,k=0;i<m;++i){ for(j=k;j<k+b[i];j++){ if(tar1[j]!=bit){ c+=MoveBit(j,bit,tar1); } } bit^=1;k+=b[i]; } mi = min(c,mi); } if(sum==zero){ c=0;bit = 0; for(i=0,k=0;i<m;++i){ for(j=k;j<k+b[i];j++){ if(tar2[j]!=bit){ c+=MoveBit(j,bit,tar2); } } bit^=1;k+=b[i]; } mi = min(c,mi); } printf("%d\n",mi); } return 0; }
AC代码2:#include<iostream> #include<algorithm> #include<cstring> #include<string> #include<cstdio> #include<vector> #include<queue> using namespace std; #define T 150 typedef long long ll; int n,m; struct node { int x,c; node(){}; node(int _x):x(_x),c(0){}; }; int vis[1000000]; int bfs(int src,int tar1,int tar2) { queue<node> t; node a,b; t.push(node(src)); while(!t.empty()) { a = t.front();t.pop(); if(a.x==tar1||a.x==tar2)return a.c; for(int i=1;i<n;++i){ b = a; if(((b.x>>i)&1) ^ ((b.x>>(i-1))&1)){ b.x ^= (1<<i); b.x ^= (1<<(i-1)); if(vis[b.x])continue; vis[b.x] = 1;b.c = a.c+1; t.push(b); } } } return 0; } int main() { #ifdef zsc freopen("input.txt","r",stdin); #endif // zsc int i,k,f; int src,tar1,tar2; while(~scanf("%d%d",&n,&m)) { memset(vis,0,sizeof(vis)); for(src=0,i=0;i<n;++i){ src<<=1; scanf("%d",&k); if(k&1) src++; } f = 1; for(tar1=0,tar2=0,i=0;i<m;++i){ scanf("%d",&k); while(k--) { tar1<<=1; if(f)tar1++; tar2<<=1; if(!f)tar2++; } f^=1; } printf("%d\n",bfs(src,tar1,tar2)); /*printf("src: %d\n",src); printf("%d %d\n",tar1,tar2);*/ } return 0; }