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_酱神的旅行 2015 UESTC Training for Dynamic Programming<Problem M>
M - 酱神的旅行 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- Volist标签 key值的使用
Volist标签是thinkphp框架view中常用到的一个标签.主要用于在模板中循环输出数据集或者多维数组.今天使用key属性时出了点问题,记录一下. volist标签(循环输出数据) 闭合 非闭合 ...
- rsync常用参数详解
rsync常用参数详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在linux中,一切皆是文件,包括你的终端,硬件设备信息,目录,内核文件等等.所以工作中我们难免会遇到拷贝文件 ...
- N种方法妙讲LIS算法
LIS算法经典汇总 假设存在一个序列d[1..9] = 2 1 5 3 6 4 8 9 7,可以看出来它的LIS长度为5.下面一步一步试着找出它.我们定义一个序列B,然后令 i = 1 to 9 逐个 ...
- C# 数据的序列化存取
1,什么是序列化? 序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列 ...
- 安装mysql时出错。无法初始化。 libstdc++.so.5
./bin/mysqld: error while loading shared libraries: libstdc++.so.5: cannot open shared object file: ...
- Charles的使用教程
Charles是mac os和windows下的另外一个抓包软件(均收费,可破解),功能与fiddler类似,优点是可以自定义上下行网速.External Proxy.反向代理配置简单.可解析AMF协 ...
- gauge.js的应用
最近项目要做个手机端的仪表盘,但是画风太给力,echarts.highcharts.D3等等都不能满足业务的需求,你懂的!开找,找到个gauge.js 下面简单介绍下这个插件官网http://bern ...
- [转]C# 中的.pdb/ .vshost.exe/ .vshost.exe.manifest文件讨论
原文出处:http://blog.163.com/chwei_sunshine/blog/static/19412628320125893656652/ pdb文件: 英文全称:Program Dat ...
- java中拼接两个数组
int a[]={1,2,3,2}; int b[]={4,2,90,8,98}; int[] d3 = new int[a.length + b.length]; System.arraycopy( ...