poj 3185 The Water Bowls(反转)
Description
- The cows have a line of 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 water bowls to be right-side-up and thus use their wide snouts to flip bowls.
- 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 (=undrinkable, =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
- Line : A single line with space-separated integers
Output
- Line : The minimum number of bowl flips necessary to flip all the bowls right-side-up (i.e., to ). For the inputs given, it will always be possible to find some combination of flips that will manipulate the bowls to 's.
Sample Input
Sample Output
Hint
- Explanation of the sample:
- Flip bowls , , and to make them all drinkable:
- [initial state]
- [after flipping bowl ]
- [after flipping bowl ]
- [after flipping bowl ]
Source
- 题意:翻盖有奖:将一列碗翻成口朝上,一把下去可能同时反转3个或2个(首尾),求最小翻转次数。
这里给出两种方法:
- #pragma comment(linker, "/STACK:1024000000,1024000000")
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<cmath>
- #include<math.h>
- #include<algorithm>
- #include<queue>
- #include<set>
- #include<bitset>
- #include<map>
- #include<vector>
- #include<stdlib.h>
- #include <stack>
- using namespace std;
- #define PI acos(-1.0)
- #define max(a,b) (a) > (b) ? (a) : (b)
- #define min(a,b) (a) < (b) ? (a) : (b)
- #define ll long long
- #define eps 1e-10
- #define MOD 1000000007
- #define N 26
- #define inf 1e12
- int a[N],aa[N];
- int main()
- {
- for(int i=;i<;i++){
- scanf("%d",&a[i]);
- }
- int ans=;
- for(int i=;i<;i++){
- int cnt=;
- memcpy(aa,a,sizeof(a));
- if(i==){
- aa[]++;
- aa[]++;
- cnt++;
- }
- else if(i==){
- aa[]++;
- aa[]++;
- cnt++;
- }
- else if(i==){
- aa[]++;
- aa[]++;
- aa[]++;
- aa[]++;
- cnt+=;
- }
- for(int i=;i<=;i++){
- if(aa[i]&){
- aa[i]++;
- aa[i+]++;
- aa[i+]++;
- cnt++;
- }
- }
- int flag=;
- for(int j=;j<;j++){
- if(aa[j]&){
- flag=;
- break;
- }
- }
- if(flag){
- ans=min(ans,cnt);
- }
- }
- printf("%d\n",ans);
- return ;
- }
第二种方法:dfs枚举
思路:枚举反转的步数,dfs,判断是否可行,可行则输出,否则继续。
- #pragma comment(linker, "/STACK:1024000000,1024000000")
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<cmath>
- #include<math.h>
- #include<algorithm>
- #include<queue>
- #include<set>
- #include<bitset>
- #include<map>
- #include<vector>
- #include<stdlib.h>
- #include <stack>
- using namespace std;
- #define PI acos(-1.0)
- #define max(a,b) (a) > (b) ? (a) : (b)
- #define min(a,b) (a) < (b) ? (a) : (b)
- #define ll long long
- #define eps 1e-10
- #define MOD 1000000007
- #define N 26
- #define inf 1e12
- int a[N];
- int flag;
- int is_ok(){
- int f=;
- for(int i=;i<;i++){
- if(a[i]==){
- f=;
- break;
- }
- }
- if(f){
- return ;
- }
- else{
- return ;
- }
- }
- void turn(int i){
- a[i]=!a[i];
- if(i>){
- a[i-]=!a[i-];
- }
- if(i<){
- a[i+]=!a[i+];
- }
- }
- void dfs(int cur,int num,int step){
- if(flag) return;
- if(num==step){
- flag=is_ok();
- return;
- }
- if(cur>=) return;
- turn(cur);
- dfs(cur+,num+,step);
- turn(cur);
- dfs(cur+,num,step);
- }
- int main()
- {
- int num=;
- for(int i=;i<;i++){
- scanf("%d",&a[i]);
- if(a[i]==){
- num++;
- }
- }
- if(num==){
- printf("0\n");
- return ;
- }
- int ans;
- for(int i=;i<;i++){
- flag=;
- dfs(,,i);
- if(flag){
- ans=i;
- break;
- }
- }
- printf("%d\n",ans);
- return ;
- }
poj 3185 The Water Bowls(反转)的更多相关文章
- POJ 3185 The Water Bowls 【一维开关问题 高斯消元】
任意门:http://poj.org/problem?id=3185 The Water Bowls Time Limit: 1000MS Memory Limit: 65536K Total S ...
- poj 3185 The Water Bowls
The Water Bowls 题意:给定20个01串(最终的状态),每个点变化时会影响左右点,问最终是20个0所需最少操作数? 水题..直接修改增广矩阵即可:看来最优解不是用高斯消元(若是有Gaus ...
- POJ 3185 The Water Bowls(高斯消元-枚举变元个数)
题目链接:http://poj.org/problem?id=3185 题意:20盏灯排成一排.操作第i盏灯的时候,i-1和i+1盏灯的状态均会改变.给定初始状态,问最少操作多少盏灯使得所有灯的状态最 ...
- POJ 3185 The Water Bowls (高斯消元)
题目链接 题意:翻译过来就是20个0或1的开关,每次可以改变相邻三个的状态,问最小改变多少次使得所有开关都置为0,题目保证此题有解. 题解:因为一定有解,所以我们可以正序逆序遍历两次求出较小值即可.当 ...
- POJ 3185 The Water Bowls (高斯消元 求最小步数)
题目链接 题意:有20个数字,0或1.如果改变一个数的状态,它左右两边的两个数的状态也会变反.问从目标状态到全0,至少需要多少次操作. 分析: 和上一题差不多,但是比上一题还简单,不多说了,但是在做题 ...
- poj 3185 The Water Bowls 高斯消元枚举变元
题目链接 给一行0 1 的数, 翻转一个就会使他以及它左右两边的都变, 求最少多少次可以变成全0. 模板题. #include <iostream> #include <vector ...
- POJ:3185-The Water Bowls(枚举反转)
The Water Bowls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7402 Accepted: 2927 Descr ...
- POJ3185 The Water Bowls 反转(开关)
Description The cows have a line of 20 water bowls from which they drink. The bowls can be either ri ...
- POJ 1222 POJ 1830 POJ 1681 POJ 1753 POJ 3185 高斯消元求解一类开关问题
http://poj.org/problem?id=1222 http://poj.org/problem?id=1830 http://poj.org/problem?id=1681 http:// ...
随机推荐
- UESTC_神秘绑架案 CDOJ 881
神秘绑架案 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit Sta ...
- 什么是优先级队列(priority queue)?
有时候我们需要在某个元素集合中找到最小值和最大值 .优先级队列抽象数据(Priority Queue ADT)模型是我们能够使用的方法之一,这是一种支持插入和删除最小值(DeleteMin)或者最大值 ...
- LeeCode-Remove Element
Given an array and a value, remove all instances of that value in place and return the new length. T ...
- FZU1862(线段树 或者 DP)
Problem 1862 QueryProblem Accept: 100 Submit: 249Time Limit: 2000 mSec Memory Limit : 32768 KB ...
- HDOJ-1014 Uniform Generator
http://acm.hdu.edu.cn/showproblem.php?pid=1014 给出式子seed(x+1) = [seed(x) + STEP] % MOD seed初始为0,给出STE ...
- JAVA JNI
jni非常好的一篇文章 http://m.blog.csdn.net/article/details?id=22827307 JAVA JNI介绍 http://blog.csdn.net/cyg08 ...
- error C2440
error C2440: "初始化": 无法从"std::_List_const_iterator<std::_List_val<std::_List_sim ...
- 所闻所获6:meditashayne项目总结
项目源码下载地址: https://github.com/ShayneYeorg/Meditashayne 1.首先一开始设计这个App的时候,我就希望它能比系统自带的备忘录更方便:比如备忘录需要手动 ...
- 在apache2.4版本之前做客户端访问控制,是用Allow Deny Order指令做访问控制的,
在apache2.4版本之前做客户端访问控制,是用Allow Deny Order指令做访问控制的,而在2.4的版本上是用的用法跟之前的版本大不相同,如下 ###################### ...
- [网络流最大流经典][uva 11082][矩阵解压]
题目大意 分析 #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring ...