模拟,贪心的搞,从第一位开始,如果需要交换就从后面找个最近的交换就行
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <cstring>
#include <vector>
#include <set>
using namespace std;
#define ll long long
#define maxn 100005
int N, M;
int s1[20];
int s2[20];
int s3[20];
int main()
{
//freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
scanf("%d%d", &N, &M);
int zerosum = 0;
int oddsum = 0, evensum = 0;
for (int i = 0; i < N; ++i)
{
scanf("%d", &s1[i]);
if (s1[i] == 0)
++zerosum;
}
for (int i = 0; i < M; ++i)
{
scanf("%d", &s2[i]);
if ((i & 1) == 1)
oddsum += s2[i];
else
evensum += s2[i];
}
for (int i = 0; i < N; ++i)
s3[i] = s1[i];
int ans1 = 100000000, ans2 = 100000000;
if (oddsum == zerosum)
{
ans1 = 0;
bool isodd = true;
int lastpos = 0;
for (int i = 0; i < M; ++i)
{
if ((i & 1) == 1)
isodd = true;
else
isodd = false;
if (isodd)
{
for (int j = 0; j < s2[i]; ++j)
{
if (s3[lastpos + j] != 0)
{
for (int k = lastpos + j + 1; k < N; ++k)
{
if (s3[k] == 0)
{
swap(s3[lastpos + j], s3[k]);
ans1 += (k - lastpos - j);
break;
}
}
}
}
}
else
{
for (int j = 0; j < s2[i]; ++j)
{
if (s3[lastpos + j] != 1)
{
for (int k = lastpos + j + 1; k < N; ++k)
{
if (s3[k] == 1)
{
swap(s3[lastpos + j], s3[k]);
ans1 += (k - lastpos - j);
break;
}
}
}
}
}
lastpos += s2[i];
}
}
for (int i = 0; i < N; ++i)
s3[i] = s1[i];
if (zerosum == evensum)
{
ans2 = 0;
bool iseven = true;
int lastpos = 0;
for (int i = 0; i < M; ++i)
{
if ((i & 1) == 0)
iseven = true;
else
iseven = false;
if (iseven)
{
for (int j = 0; j < s2[i]; ++j)
{
if (s3[lastpos + j] != 0)
{
for (int k = lastpos + j + 1; k < N; ++k)
{
if (s3[k] == 0)
{
swap(s3[lastpos + j], s3[k]);
ans2 += (k - lastpos - j);
/*printf("%d %d ", lastpos + j, k);
printf("even %d\n", k - lastpos - j);
for (int t = 0; t < N; ++t)
printf("%d ", s3[t]);
printf("\n");*/
break;
}
}
}
}
}
else
{
for (int j = 0; j < s2[i]; ++j)
{
if (s3[lastpos + j] != 1)
{
for (int k = lastpos + j + 1; k < N; ++k)
{
if (s3[k] == 1)
{
swap(s3[lastpos + j], s3[k]);
ans2 += (k - lastpos - j);
/*printf("%d %d ", lastpos + j, k);
printf("odd %d\n", k - lastpos - j);
for (int t = 0; t < N; ++t)
printf("%d ", s3[t]);
printf("\n");*/
break;
}
}
}
}
}
lastpos += s2[i];
}
}
//printf("ans1 %d ans2 %d\n", ans1, ans2);
printf("%d\n", min(ans1, ans2));
//system("pause");
//while (1);
return 0;
}