反转问题是一种很有意思的题。
首先观察这一排碗中第一个碗,只有第二个碗能改变第一个碗的方向,因此以此类推我们就可以得出解。
枚举第一个碗是否需要翻转,取操作数最小的一个。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int bowl[25];
int f[25]; //记录区间[i-1, i+1]是否反转
//返回最小操作数
int calc(int x) {
memset(f, 0, sizeof(f));
f[0] = x;
int res = 0;
int sum = f[0];
for (int i = 1; i < 20; i++) {
//计算区间[i-1, i+1]
if ((bowl[i-1] + sum) % 2 == 1) {
res++;
f[i] = 1;
}
sum += f[i];
if (i - 2 >= 0) {
sum -= f[i-2];
}
}
return res;
}
int main(int argc, char const *argv[]) {
for (int i = 0; i < 20; i++) {
scanf("%d", &bowl[i]);
}
//记得+1
printf("%d\n", min(calc(0), calc(1) + 1));
return 0;
}