A题 点击打开链接
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int a[15],b[15];
int main()
{
int n,m;
int f,z;
int c1,c2;
while(~scanf("%d %d",&n,&m))
{
memset(b,0,sizeof(b));
f=0;z=0;//记录1和0的个数
c1=0;c2=0;//记录奇数项和与偶数项和
int ci=100000,ans=100000;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]==1)
f++;
else z++;
}
for(int i=1;i<=m;i++)
{
scanf("%d",&b[i]);
if(i%2)
c1+=b[i];
else c2+=b[i];
}
int res=0,t=0;
int sum=1;//记录在整个长度的下标
if(c1==z)
{
ci=0;
for(int i=1;i<=m;i+=2)
{
res=b[i];t=0;//res记录在此区间有几个相同的值
for(int j=1;j<=n;j++)
{
if(a[j]==0)
{
ci+=abs(sum-j);//移动的次数
sum++;
t++;//移动了几位
a[j]=3;//表示当前位置已经用过
if(t==res)
break;
}
}
sum+=b[i+1];
}
}
if(c1==f)
{
ans=0;res=0;sum=1;t=0;
for(int i=1;i<=m;i+=2)
{
res=b[i];t=0;
for(int j=1;j<=n;j++)
{
if(a[j]==1)
{
ans+=abs(sum-j);
sum++;
t++;
a[j]=3;//表示当前位置已经用过
if(t==res)
break;
}
}
sum+=b[i+1];
}
}
ci=min(ci,ans);//用来判断当1和0个数相同时,那种方式次数最少
printf("%d\n",ci);
}
return 0;
}