poj-3185-开关问题

简介: 描述   牛一行20他们喝的水碗。碗可以那么(面向正确的为清凉水)或颠倒的(一个位置而没有水)。他们希望所有20个水碗那么,因此用宽鼻子翻碗。   嘴太宽,他们不仅翻转一碗还碗的碗两侧(总共三个或三个——在两端的情况下碗——两碗)。

描述

 

牛一行20他们喝的水碗。碗可以那么(面向正确的为清凉水)或颠倒的(一个位置而没有水)。他们希望所有20个水碗那么,因此用宽鼻子翻碗。

 

嘴太宽,他们不仅翻转一碗还碗的碗两侧(总共三个或三个——在两端的情况下碗——两碗)。

 

给定的初始状态碗(1 =不能饮用的,0 =饮用——它甚至看起来像一碗),什么是必要的最小数量的碗翻转将所有的碗那么?

 

输入

 

1号线:一行20空格分隔的整数

 

输出

 

线路1:所需的最小数量的碗翻转翻碗那么(即。0)。对于给定的输入,它总是可以找到一些组合的翻转操作碗20 0。

 

样例输入

0 0 1 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0

 

样例输出

3

 

提示

 

解释的样本:

 

翻转碗4,9岁和11岁时让他们饮用:

0 0 1 1 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0(初始状态)

0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0(后翻碗4]

0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0翻碗后[9]

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0翻碗后[11]

思路:
分别从左右两边开始,找到为1 的位置,让后两个取反;不可能出现最后位置或首位置翻到最后扔为1;所以当这种情况出现就赋大值给计数器并终止
循环;最后取左右两计数器的最小值

#include<cmath> #include<iostream> using namespace std ; int main () { int cnt1=0,cnt2=0; int a[20],b[20]; for(int i=0;i<20;i++) { cin>>a[i]; b[i]=a[i]; } for(int i=0;i<20;i++) { if(a[i]==1) { if(i==19) {cnt1=20; break; } cnt1++; a[i+1]=!a[i+1]; a[i+2]=!a[i+2]; } } for(int i=19;i>=0;i--) { if(b[i]==1) { if(i==0) { cnt2=20; break; } cnt2++; b[i-1]=!b[i-1]; b[i-2]=!b[i-2]; } } cout<<min(cnt1,cnt2)<<endl; return 0; }

  

相关文章
|
8月前
|
算法 数据建模
Poj 3169(差分约束系统)
Poj 3169(差分约束系统)
38 0
|
人工智能 机器学习/深度学习
|
算法 数据建模 机器学习/深度学习
poj 3620
题意:给出一个矩阵,其中有些格子干燥、有些潮湿。       如果一个潮湿的格子的相邻的四个方向有格子也是潮湿的,那么它们就可以构成更大       的湖泊,求最大的湖泊。       也就是求出最大的连在一块儿的潮湿的格子的数目。
581 0
poj 3664
http://poj.org/problem?id=3664 进行两轮选举,第一轮选前n进入第二轮,第二轮选最高   #include #include using namespace std; struct vote { int a,b; int c; ...
742 0
poj-3094-quicksum
http://poj.org/problem?id=3094 很简单 #include #include using namespace std; int main() { string a; int sum=0; while(getline(cin...
581 0