POJ3185 The Water Bowls

  题目大意: 奶牛有20只碗摆成一排,用鼻子顶某只碗的话,包括左右两只在内的一共三只碗会反向,现在给出碗的初始状态,问至少要用鼻子顶多少次才能使所有碗都朝上

  一开始试了一下dfs,由于对dfs还是不太熟悉,先是用了一个数组b[i]来储存翻转后的状态,后来发现这个搜索的状态虽然类似背包,要么翻转,要么不翻转,但是翻转某个碗以后会对其他的也造成影响,所以这样这样做就错了,可以只用原来的数组就ok了

在上述问题解决后,又因为胡乱剪枝导致wa了几次,一开始我想先对a[0]和a[19]进行判断是否为1,来确定是否需要翻转,这样的话a[19]那儿的1可能是翻转后形成的,这是进行翻转就回不到原来的状态,导致没法遍历2^n而wa,同时,对a[0]是否为1的判断也是错的,因为a[0]等于1时也可以通过翻转a[1]来实现a[0]=0的要求,a[19]=1也可翻转下一次的a[18].

不用任何优化顶多2^20(10的6次方左右),也可以过,我最后是250ms左右过的.

  dfs代码:(毕竟dfs的题做的比较少,也就先用dfs来练手了)(先翻转再翻回来的dfs才是对的)

  

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <cmath>
  5. #include <ctime>
  6. #include <iostream>
  7. #include <algorithm>
  8. #include <string>
  9. #include <vector>
  10. #include <deque>
  11. #include <list>
  12. #include <set>
  13. #include <map>
  14. #include <stack>
  15. #include <queue>
  16. #include <numeric>
  17. #include <iomanip>
  18. #include <bitset>
  19. #include <sstream>
  20. #include <fstream>
  21. using namespace std;
  22. #define rep(i,a,n) for (int i=a;i<n;i++)
  23. #define per(i,a,n) for (int i=n-1;i>=a;i--)
  24. #define in(n) scanf("%d",&(n))
  25. #define in2(x1,x2) scanf("%d%d",&(x1),&(x2))
  26. #define inll(n) scanf("%I64d",&(n))
  27. #define inll2(x1,x2) scanf("%I64d%I64d",&(x1),&(x2))
  28. #define inlld(n) scanf("%lld",&(n))
  29. #define inlld2(x1,x2) scanf("%lld%lld",&(x1),&(x2))
  30. #define inf(n) scanf("%f",&(n))
  31. #define inf2(x1,x2) scanf("%f%f",&(x1),&(x2))
  32. #define inlf(n) scanf("%lf",&(n))
  33. #define inlf2(x1,x2) scanf("%lf%lf",&(x1),&(x2))
  34. #define inc(str) scanf("%c",&(str))
  35. #define ins(str) scanf("%s",(str))
  36. #define out(x) printf("%d\n",(x))
  37. #define out2(x1,x2) printf("%d %d\n",(x1),(x2))
  38. #define outf(x) printf("%f\n",(x))
  39. #define outlf(x) printf("%lf\n",(x))
  40. #define outlf2(x1,x2) printf("%lf %lf\n",(x1),(x2));
  41. #define outll(x) printf("%I64d\n",(x))
  42. #define outlld(x) printf("%lld\n",(x))
  43. #define outc(str) printf("%c\n",(str))
  44. #define pb push_back
  45. #define mp make_pair
  46. #define fi first
  47. #define se second
  48. #define SZ(x) ((int)(x).size())
  49. #define mem(X,Y) memset(X,Y,sizeof(X));
  50. typedef vector<int> vec;
  51. typedef long long ll;
  52. typedef pair<int,int> P;
  53. const int dx[]={,,-,},dy[]={,,,-};
  54. const int INF=0x3f3f3f3f;
  55. const ll mod=1e9+;
  56. ll powmod(ll a,ll b) {ll res=;a%=mod;for(;b;b>>=){if(b&)res=res*a%mod;a=a*a%mod;}return res;}
  57. const bool AC=true;
  58.  
  59. int a[],b[],ans;
  60. bool flag;
  61. void dfs(int i,int cnt){
  62. if(i==){
  63. flag=true;
  64. rep(j,,){
  65. if(a[j]==) {
  66. flag=false;
  67. break;
  68. }
  69. }
  70. if(flag){
  71. ans=min(ans,cnt);
  72. }
  73. return;
  74. }
  75. else if(i==){
  76. a[i]=!a[i];
  77. a[i+]=!a[i+];
  78. dfs(i+,cnt+);
  79. a[i]=!a[i];
  80. a[i+]=!a[i+];
  81. dfs(i+,cnt); //此处也不用判断是否为1来剪枝,否则会wa
  82. }
  83. else if(i==){
  84. a[i]=!a[i];
  85. a[i-]=!a[i-];
  86. dfs(i+,cnt+);
  87. a[i]=!a[i];
  88. a[i-]=!a[i-];
  89. dfs(i+,cnt); //不要乱剪枝,否则翻转不回来
  90. }
  91. else{
  92. a[i]=!a[i];
  93. a[i-]=!a[i-];
  94. a[i+]=!a[i+];
  95. dfs(i+,cnt+);//先翻转,再翻回来
  96. a[i]=!a[i];
  97. a[i-]=!a[i-];
  98. a[i+]=!a[i+];
  99. dfs(i+,cnt);
  100. }
  101. return ;
  102. }
  103. int main(){
  104. rep(i,,) {
  105. in(a[i]);
  106. }
  107. ans=INF;
  108. dfs(,);
  109. out(ans);
  110. return ;
  111. }

下面是反转法:考虑某个碗,翻转下一个碗.

       如果某个碗是0,则这个碗不需要考虑,继续考虑下一个碗,不断向前推进区间;

       如果某个碗是1,则必须翻转下一个碗,继续考虑下一个碗,不断向前推进区间;

       这样复杂度就是O(n),类似尺取法的思想;

        从对称性的角度考虑问题

   wa的注意了,不要通过判断a[0]=0来确定是否需要反转a[0],这样是错的如下面的情况: 0 0 1 0 0 0 0 0.....后面全是0,这时如果反转a[0]需要2步,不翻转a[0]需要12步(因为这个wa了n次),

    所以不管a[0]为什么值都要尝试一下是否需要反转a[0],从对称性来看,从左向右翻转,a[19]要么翻转,要么不翻转,

    所以翻转法有两种实现方式:从左向右翻转两次(反转a[0]或者不反转a[0])

                从左向右翻转一次(不翻转a[0]),再从右向左翻转一次(不翻转a[19]);(让某个碗翻转的方式有两种)

 从左向右翻转两次(反转a[0]或者不反转a[0])

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. int a[],b[];
  6. void turn(int i){
  7. b[i-]^=;
  8. b[i]^=;
  9. if(i<) b[i+]^=;
  10. }
  11. int main(){
  12. int cnt1=,cnt2=;
  13. for(int i=;i<;i++)
  14. scanf("%d",&a[i]);
  15. //反转b[0];
  16. memcpy(b,a,sizeof(a));
  17. b[]^=;
  18. b[]^=;
  19. cnt1++; //此处要加1
  20. for(int i=;i<;i++){
  21. if(b[i]){
  22. turn(i+);//考虑某个碗,反转其后面的碗
  23. cnt1++;
  24. }
  25. }
  26. if(b[]) cnt1=0x3f3f3f3f;
  27. //不反转b[0];
  28. memcpy(b,a,sizeof(a));
  29. for(int i=;i<;i++){
  30. if(b[i]){
  31. turn(i+);//考虑某个碗,反转其后面的碗
  32. cnt2++;
  33. }
  34. }
  35. if(b[]) cnt2=0x3f3f3f3f;
  36. printf("%d\n",min(cnt1,cnt2));
  37. return ;
  38. }

从左向右翻转一次(不翻转a[0]),再从右向左翻转一次(不翻转a[19]);

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. int a[],b[];
  6. void turn1(int i){
  7. b[i-]^=;
  8. b[i]^=;
  9. if(i<) b[i+]^=;
  10. }
  11. void turn2(int i){
  12. a[i+]^=;
  13. a[i]^=;
  14. if(i>) a[i-]^=;
  15. }
  16. int main(){
  17. int cnt1=,cnt2=;
  18. for(int i=;i<;i++)
  19. scanf("%d",&a[i]);
  20. memcpy(b,a,sizeof(a));
  21. for(int i=;i<;i++){
  22. if(b[i]){
  23. turn1(i+);//考虑某个碗,反转其后面的碗
  24. cnt1++;
  25. }
  26. }
  27. if(b[]) cnt1=0x3f3f3f3f;
  28. for(int i=;i>;i--){
  29. if(a[i]){
  30. turn2(i-);//考虑某个碗,反转其前面的碗
  31. cnt2++;
  32. }
  33. }
  34. if(a[]) cnt2=0x3f3f3f3f;
  35. printf("%d\n",min(cnt1,cnt2));
  36. return ;
  37. }

POJ3185 The Water Bowls(反转法or dfs 爆搜)的更多相关文章

  1. HDU 4403 A very hard Aoshu problem(dfs爆搜)

    http://acm.hdu.edu.cn/showproblem.php?pid=4403 题意: 给出一串数字,在里面添加一个等号和多个+号,使得等式成立,问有多少种不同的式子. 思路: 数据量比 ...

  2. POJ3185 The Water Bowls 反转(开关)

    Description The cows have a line of 20 water bowls from which they drink. The bowls can be either ri ...

  3. [Gauss]POJ3185 The Water Bowls

    题意:反正就是要给的一串01的变成全0 能影响自己和左右 最少需要几步 01方程组 异或解 ][]; // 增广矩阵 ]; // 解 ]; // 标记是否为自由未知量 int n; void debu ...

  4. 【BZOJ-1060】时态同步 树形DP (DFS爆搜)

    1060: [ZJOI2007]时态同步 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2101  Solved: 595[Submit][Statu ...

  5. hdu 5506 GT and set(dfs爆搜)

    Problem Description You are given N sets.The i−th set has Ai numbers.You should divide the sets into ...

  6. 火车进栈(进出栈的模拟,dfs爆搜)

    这里有n列火车将要进站再出站,但是,每列火车只有1节,那就是车头. 这n列火车按1到n的顺序从东方左转进站,这个车站是南北方向的,它虽然无限长,只可惜是一个死胡同,而且站台只有一条股道,火车只能倒着从 ...

  7. hdu 4770(枚举 + dfs爆搜)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4770 思路:由于最多只有15个".",可以直接枚举放置的位置,然后判断是否能够全部 ...

  8. Ancient Go---hdu5546(dfs爆搜CCPC题目)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5546 题意就是两个人下围棋,问在下一颗x是否能杀死o,'.'是空位子: 枚举所有的点,判断是否合法即可 ...

  9. 【csp模拟赛2】 爆搜 方格加数

    [题目描述] xyz1048576正在玩一个关于矩阵的游戏. 一个n*m的矩阵,矩阵中每个数都是[1,12]内的整数.你可以执行下列两个操作任意多次: (1)指定一行,将该行所有数字+1. (2)指定 ...

随机推荐

  1. Linux&shell 之基本Shell命令

    写在前面:案例.常用.归类.解释说明.(By Jim) 文件和目录列表lsls -F (用斜杠区分目录和文件)ls -a (把隐藏文件一并显示出来)ls -l (同ll,显示详细信息)ls -l 文件 ...

  2. CH Round #49 - Streaming #4 (NOIP模拟赛Day2)

    A.二叉树的的根 题目:http://www.contesthunter.org/contest/CH%20Round%20%2349%20-%20Streaming%20%234%20(NOIP 模 ...

  3. 【转】Android JNI编程—JNI基础

    原文网址:http://www.jianshu.com/p/aba734d5b5cd 最近看到了很多关于热补的开源项目——Depoxed(阿里).AnFix(阿里).DynamicAPK(携程)等,它 ...

  4. [转]stringstream的用法

    使用stringstream对象简化类型转换C++标准库中的<sstream>提供了比ANSI C的<stdio.h>更高级的一些功能,即单纯性.类型安全和可扩展性.在本文中, ...

  5. 高性能Java Web 页面静态化技术(原创)

    package com.yancms.util; import java.io.*; import org.apache.commons.httpclient.*; import org.apache ...

  6. Hibernate五 HQL查询

    HQL查询一 介绍1.HQL:Hibernate Query Language,是一种完全面向对象的查询语言.使用Hibernate有多重查询方式可供选择:hibernate的HQL查询,也可以使用条 ...

  7. mysql5.5 对触发器,函数,存储引擎,事件进行主从复制情况.(转)

       mysql5.5 对触发器,函数,存储引擎,事件进行主从复制情况. 转(http://blog.csdn.net/m582445672/article/details/7670802) 一.My ...

  8. Android中的Apk的加固(加壳)原理解析和实现

    一.前言 今天又到周末了,憋了好久又要出博客了,今天来介绍一下Android中的如何对Apk进行加固的原理.现阶段.我们知道Android中的反编译工作越来越让人操作熟练,我们辛苦的开发出一个apk, ...

  9. Linux 开机自检的设置(tune2fs和fsck)

      tune2fs和fsck的用法 tune2fs--调整ext2/ext3文件系统特性的工具. -l <device> 查看文件系统信息 -c <count> 设置强制自检的 ...

  10. configure JAAS for jboss 7.1 and mysql--reference

    Hello all, In this tutorial we are going to configure JAAS for jboss 7.1 and mysql for Form based au ...