The Water Bowls [POJ3185] [开关问题]

题意

一串长度为20的0,1数列,每次翻转i,会影响i-1,i+1,也被翻转,最少翻转成0的步骤数是多少?

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

分析

这一道开关问题和POJ3276很类似,但是那个是有固定长度的,我们可以看做是一个点向后的一个区间进行翻转,就不会对前面产生影响.

这道题就不一样,会影响前面的,那我们就看做是i为作用点,i+1,i+2为附带效应点,就可以转换成上面那种类型了。只是要在位置0的地方枚举是否要翻转,在位置20判断。

代码

 1 #include<set>
 2 #include<map>
 3 #include<queue>
 4 #include<stack>
 5 #include<cmath>
 6 #include<cstdio>
 7 #include<cstring>
 8 #include<iostream>
 9 #include<algorithm>
10 #define RG register int
11 #define rep(i,a,b)    for(RG i=a;i<=b;++i)
12 #define per(i,a,b)    for(RG i=a;i>=b;--i)
13 #define ll long long
14 #define inf (1<<29)
15 using namespace std;
16 int n,ans,A;
17 int num[25],f[25];
18 inline int read()
19 {
20     int x=0,f=1;char c=getchar();
21     while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
22     while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
23     return x*f;
24 }
25
26 int main()
27 {
28     freopen("a","r",stdin);
29     freopen("b","w",stdout);
30     n=20;
31     rep(i,1,20)    num[i]=read();
32     {
33         f[0]=1,A=1;
34         if((num[1]+f[0])&1)    f[1]=1,A++;
35         rep(i,2,19)
36             if((f[i-1]+f[i-2]+num[i])&1)    f[i]=1,A++;
37         if((f[19]+f[18]+num[20])&1)    A=inf;
38     }
39     {
40         memset(f,0,sizeof(f));
41         if((num[1]+f[0])&1)    f[1]=1,ans++;
42         rep(i,2,n)
43             if((f[i-1]+f[i-2]+num[i])&1)    f[i]=1,ans++;
44         if((f[19]+f[18]+num[20])&1)    ans=inf;
45     }
46     if((f[18]+f[19]+num[20])&1)cout<<inf;
47     else cout<<min(ans,A);
48     return 0;
49 }

原文地址:https://www.cnblogs.com/ibilllee/p/9302022.html

时间: 2024-10-18 07:25:37

The Water Bowls [POJ3185] [开关问题]的相关文章

POJ3185 The Water Bowls 反转(开关)

Description The cows have a line of 20 water bowls from which they drink. The bowls can be either right-side-up (properly oriented to serve refreshing cool water) or upside-down (a position which holds no water). They want all 20 water bowls to be ri

POJ 3185 The Water Bowls(高斯消元法,枚举自由变元)

题目: The Water Bowls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5013   Accepted: 1960 Description The cows have a line of 20 water bowls from which they drink. The bowls can be either right-side-up (properly oriented to serve refresh

poj 3185 The Water Bowls(高斯消元)

The Water Bowls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4352   Accepted: 1721 Description The cows have a line of 20 water bowls from which they drink. The bowls can be either right-side-up (properly oriented to serve refreshing

poj3185--The Water Bowls(高斯消元问题3)

The Water Bowls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4623   Accepted: 1812 Description The cows have a line of 20 water bowls from which they drink. The bowls can be either right-side-up (properly oriented to serve refreshing

[Gauss]POJ3185 The Water Bowls

题意:反正就是要给的一串01的变成全0 能影响自己和左右 最少需要几步 01方程组 异或解 1 int a[300][300]; // 增广矩阵 2 int x[300]; // 解 3 int free_x[300]; // 标记是否为自由未知量 4 5 int n; 6 void debug() 7 { 8 for(int i=0;i<n*n;i++) 9 { 10 for(int j=0;j<n*n;j++) 11 printf("%d ", a[i][j]); 12

Greedy:The Water Bowls(POJ 3185)

水池 题目大意:给定一个20的数组,全都是0和1,可以翻一个数改变成另一个数(0或者1),但是其左右两边的数都会跟着变为原来的相反数,问你怎么用最小的操作数使全部数变成0 这一题的:满足 1:翻转次序不改变结果 2.  从特定次序翻转以后左侧的元素不会再改变 其实就是3276的变形,只是他这次固定变三个数,而且是一前一后,我们把方向dir的查看往前挪一个数就好了,但是这样我们就不能知道第一个数是否需要翻转,所以我们分两种情况来讨论就好了 一开始我想着像3276那样枚举,可是1<<20次实在是太

poj3185 开关问题

题意:有20个碗排成一排,有些碗口朝上,有些碗口朝下.每次可以反转连续的3只碗,如果该碗为边界上的碗,则只有一侧的碗被反转.求最少需要反转几次,可以使得所有碗口均朝上.0为上,1为下 传送门:https://vjudge.net/problem/POJ-3185 这题也是挑战程序设计竞赛来的.看了白书的例题其实这就很好想了.先分别枚举第一个碗翻不翻转,然后依次从左往右枚举给去.例如判断第i个翻不翻转,这时候i-1,i-2已经确定翻不翻转.然而影响i-1的有 i-2,i-1,i,所以为了使i-1向

POJ 3185 - The Water Bowls

据网上传闻,用高斯消元解?(我就是在学高斯消元的时候看到有拿这个题当练手题的) 但是,看到discuss上有人说根本不用什么高斯消元和搜索,我一想也是--这题显然用贪心啊-- 首先前提:翻转问题,1.每个碗只有主动翻转一次和不主动翻转两种情况:2.主动翻转碗的顺序对结果没有影响. 于是我们的思路是,强制按照从左到右这个顺序翻碗碗, 那么,如果有个bowl[i]是1(并且bowl[1]--bowl[i-1]都已经是0),我们要把他变成0,只能翻bowl[i+1],否则,若是我们翻bowl[i],就

poj 3185 The Water Bowls 高斯消元枚举变元

题目链接 给一行0 1 的数, 翻转一个就会使他以及它左右两边的都变, 求最少多少次可以变成全0. 模板题. #include <iostream> #include <vector> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <map> #include <set> #include