Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 5941 | Accepted: 2344 |
Description
Their snouts, though, are so wide that they flip not only one bowl but also the bowls on either side of that bowl (a total of three or -- in the case of either end bowl -- two bowls).
Given the initial state of the bowls (1=undrinkable, 0=drinkable -- it even looks like a bowl), what is the minimum number of bowl flips necessary to turn all the bowls right-side-up?
Input
Output
Sample Input
0 0 1 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0
Sample Output
3
Hint
Flip bowls 4, 9, and 11 to make them all drinkable:
0 0 1 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 [initial state]
0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 [after flipping bowl 4]
0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 [after flipping bowl 9]
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 [after flipping bowl 11]
有20个碗排成一排,有些碗口朝上,有些碗口朝下。每次可以反转其中的一个碗,但是在反转该碗时,该碗左右两边的碗也跟着被反转(如果该碗为边界上的碗,则只有一侧的碗被反转)。求最少需要反转几次,可以使得所有碗口均朝上
这题很坑,,测试数据,,
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
可以从俩边遍历取最小值,不然考虑的情况太多容易卡特殊数据,,,
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int inf = 0x3f3f3f3f;
int dir1[30],dir2[30], f[30];
int main()
{
while(scanf("%d",&dir1[0])!=EOF)
{
memset(f,0,sizeof(f));
for(int i=1; i<20; i++)
{
scanf("%d", &dir1[i]);
}
memcpy(dir2,dir1,sizeof(dir1));
int cnt1=0, cnt2=0, res;
for(int i=0;i<=19;i++)
{
if(dir1[i]==1)
{
if(i==19)
{
cnt1=inf;
break;
}
cnt1++;
dir1[i+1]=!dir1[i+1];
dir1[i+2]=!dir1[i+2];
}
}
for(int i=19;i>=0;i--)
{
if(dir2[i]==1)
{
if(i==0)
{
cnt2=inf;
break;
}
cnt2++;
dir2[i-1]=!dir2[i-1];
dir2[i-2]=!dir2[i-2];
}
}
res=min(cnt1,cnt2);
printf("%d\n",res);
}
return 0;
}