您的位置:首页 > 其它

Uvalive 6832 Bit String Reordering

2015-09-09 18:35 363 查看
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

int N,M,ans,n1,n2,m1,m2,fi,minn;
//n1 stand for the number of zero
//n2 stand for the number of one
int a[20],b[20],c[20],d[20];
bool vis[20];

void fun(){
ans=0;
memset(vis,false,sizeof(vis));
for(int i=0;i<N;i++)
d[i]=a[i];
for(int i=0;i<N;i++){
if(d[i]==c[i])
continue;
for(int j=i+1;j<N;j++){
if(c[j]!=c[i]&&c[j]!=d[j]&&!vis[j]){
d[i]=c[i];
d[j]=c[j];
ans+=(j-i);
vis[i]=true;
vis[j]=true;
//test
/*
for(int k=0;k<N;k++)
printf("%d ",d[k]);
printf("\n");
*/
break;
}
}
}
}

int main(){
while(scanf("%d%d",&N,&M)!=EOF){
minn=9999999;
n1=n2=m1=m2=0;
for(int i=0;i<N;i++){
scanf("%d",&a[i]);
if(a[i]==0)
n1++;
else
n2++;
}
for(int i=0;i<M;i++){
scanf("%d",&b[i]);
if(i%2)
m2+=b[i];
else
m1+=b[i];
}
//printf("%d %d %d %d\n",n1,n2,m1,m2);
if(n1>n2){
if(m1>m2)
fi=0;
else
fi=1;
}
else if(n1<n2){
if(m1<m2)
fi=0;
else
fi=1;
}
if(n1!=n2){
//printf("fi=%d\n",fi);
for(int i=0,j=0;j<M;j++){
for(int k=0;k<b[j];k++){
c[i+k]=fi;
}
fi=(fi+1)%2;
i+=b[j];
}

//test
/*
for(int i=0;i<N;i++){
printf("%d ",c[i]);
}
printf("\n");
*/
fun();
minn=min(ans,minn);
}
else{
fi=0;
for(int i=0,j=0;j<M;j++){
for(int k=0;k<b[j];k++){
c[i+k]=fi;
}
fi=(fi+1)%2;
i+=b[j];
}
fun();
minn=min(ans,minn);
fi=1;
for(int i=0,j=0;j<M;j++){
for(int k=0;k<b[j];k++){
c[i+k]=fi;
}
fi=(fi+1)%2;
i+=b[j];
}
fun();
minn=min(ans,minn);
}
printf("%d\n",minn);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uvalive