题目

题目描述

有三个牛奶桶,三个桶的容积分别是A,B,C,最小为1,最大为20。刚开始只有第三个桶里面装满了牛奶,其余两个桶都是空的。我们现在可以将第三个桶中的牛奶往其他两个桶里面倒一些牛奶,然后还可以将其他两个桶往另一个桶中倒牛奶,但是我们在操作的时候有严格的要求:

从一个桶往另一个桶中倒牛奶,要么直到第二个桶已经装满了,要么直到第一个桶已经空了。在倒牛奶的过程中不允许浪费。

在来回经过一系列的倒牛奶的操作之后,现在我们需要知道当第一个牛奶桶为空的时候,第三个牛奶桶可能的牛奶量为多少。

输入

一行输入三个整数 A,B,C。

输出

按照从小到大的顺序输出当第一个桶为空时第三个桶中的可能牛奶量。

输入样例

  1. 8 9 10

输出样例

  1. 1 2 8 9 10

输入样例

  1. 2 5 10

输出样例

  1. 5 6 7 8 9 10

题目分析

最开始拿到这个题目的时候想过用枚举的方法来实现,但是在如何处理状态的地方卡住了,不知道怎样才能停止。基础还是不扎实啊,思维不够。

用暴力枚举来求解这个题目,因为每个桶的状态最多为20,那么最多的状态为20*20*20=8000,这个数据量不算大,所以我们可以用一个三维的布尔类型状态数组来记录。states[a][b][c]表示三个桶的牛奶分别为a,b,c时的状态。状态是通过倒牛奶的操作来实现的,只有6种操作来转移状态:

A->B A->C B->A B->C C->A C->B,我们只要将这六种操作模拟出来就行了。

代码

  1. /*
  2. ID: yinzong2
  3. PROG: milk3
  4. LANG: C++11
  5. */
  6. #define MARK
  7. #include <iostream>
  8. #include <cstring>
  9. using namespace std;
  10. const int maxn = 21;
  11. int A,B,C;
  12. int states[maxn][maxn][maxn];
  13. void solve(int a, int b, int c);
  14. void next(int x, int y, int z) {
  15. if (!states[x][y][z]) {
  16. states[x][y][z] = true;
  17. solve(x, y, z);
  18. }
  19. }
  20. // 枚举所有的可能状态,如果某个状态已经到达过,那么就不需要处理它
  21. void solve(int a, int b, int c) {
  22. int x, y, z;
  23. // A->B
  24. x = 0; y = a+b; z = c;
  25. if (y > B) {
  26. x = y-B;
  27. y = B;
  28. }
  29. next(x, y, z);
  30. // A->C;
  31. x = 0; y = b; z = a+c;
  32. if (z > C) {
  33. x = z-C;
  34. z = C;
  35. }
  36. next(x, y, z);
  37. // B->A
  38. x = a+b; y = 0; z = c;
  39. if (x > A) {
  40. y = x-A;
  41. x = A;
  42. }
  43. next(x, y, z);
  44. // B->C
  45. x = a; y = 0; z = b+c;
  46. if (z > C) {
  47. y = z-C;
  48. z = C;
  49. }
  50. next(x, y, z);
  51. // C->A
  52. x = a+c; y = b; z = 0;
  53. if (x > A) {
  54. z = x-A;
  55. x = A;
  56. }
  57. next(x, y, z);
  58. // C->B
  59. x = a; y = b+c; z = 0;
  60. if (y > B) {
  61. z = y-B;
  62. y = B;
  63. }
  64. next(x, y, z);
  65. }
  66. int main() {
  67. #ifdef MARK
  68. freopen("milk3.in", "r", stdin);
  69. freopen("milk3.out", "w", stdout);
  70. #endif // MARK
  71. while (cin >> A >> B >> C) {
  72. memset(states, false, sizeof(states));
  73. states[0][0][C] = true;
  74. solve(0, 0, C);
  75. bool first = true;
  76. for (int c = 0; c <= C; ++c) {
  77. if (states[0][C-c][c]) {
  78. if (!first) cout << " ";
  79. cout << c;
  80. first = false;
  81. }
  82. }
  83. cout << endl;
  84. }
  85. return 0;
  86. }

USACO Section 1.4 Mother's Milk 解题报告的更多相关文章

  1. USACO Section1.4 Mother's Milk 解题报告

    milk3解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...

  2. USACO Section 1.3 Ski Course Design 解题报告

    题目 题目描述 有N座山,每座山都有一个高度,现在由于农夫想避税,所以想把这些山的高度进行一些改变,使得最高的山与最低的山之间的高度差不超过17.每座山最多只能改变一次高度,每次改变高度都会产生一定的 ...

  3. USACO Section 1.2 Name That Number 解题报告

    题目 题目描述 在一个农场里面,每一头牛都有一个数字编号,但是现在这些牛不喜欢这种编号,它们想把这些数字编号转化成为可以接受的字母的形式.数字与字母的转换表如下: 2: A,B,C 5: J,K,L ...

  4. USACO Section 1.1 Friday the Thirteenth 解题报告

    题目 题目描述 黑色星期五是否真的是一件不同寻常的事情?按理来说每个月的13号可能是星期一,或者是星期二...或者是星期天,但是黑色星期五的存在让我们不禁开始猜想,难道每个月的13号刚好是星期五的频率 ...

  5. USACO Section 1.1 Greedy Gift Givers 解题报告

    题目 问题描述 有若干个朋友,朋友之间可以选择互相赠送一些有价值的礼物.一个人可以选择将一部分钱分给若干个朋友,例如某人送给其他两个人钱,总共赠送3元,两个人平均分,原本应该是每人1.5元,但是只能取 ...

  6. USACO Section1.3 Mixing Milk 解题报告

    milk解题报告 —— icedream61 博客园(转载请注明出处)----------------------------------------------------------------- ...

  7. USACO Section2.1 Sorting a Three-Valued Sequence 解题报告

    sort3解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...

  8. USACO Section 1.3 Mixing Milk 解题报告

    题目 题目描述 Merry Milk Makers 公司的业务是销售牛奶.它从农夫那里收购N单位的牛奶,然后销售出去.现在有M个农夫,每个农夫都存有一定量的牛奶,而且每个农夫都会有自己的定价.假设所有 ...

  9. Section 1.4 Mother's Milk

    又是一道怨念已久的题目0 0之前深搜写过广搜写过,怎么就是卡死,我还以为FP坏了重新装了一遍.今天偶尔翻起来,发现广搜忘记inc(head)了…简直哭瞎… 简单的广搜,分类比较多,不过不太要动脑子.至 ...

随机推荐

  1. 20155330 《网络对抗》 Exp2 后门原理与实践

    20155330 <网络对抗> 实验二 后门原理与实践 基础问题回答 例举你能想到的一个后门进入到你系统中的可能方式? 在网站上下载非官方软件,所下载的软件中携带伪装过的后门程序. 例举你 ...

  2. [清华集训2015 Day1]玛里苟斯-[线性基]

    Description Solution 考虑k=1的情况.假设所有数中,第i位为1的数的个数为x,则最后所有的子集异或结果中,第i位为1的个数为$(C_{k}^{1}+C_{k}^{3}+...)$ ...

  3. Eclipse中Hadoop插件配置

    Eclipse中Hadoop插件DFS配置 http://www.cnblogs.com/xia520pi/archive/2012/05/20/2510723.html

  4. HDU 6333 Harvest of Apples (分块、数论)

    题目连接:Harvest of Apples 题意:给出一个n和m,求C(0,n)+C(1,n)+.....+C(m,n).(样例组数为1e5) 题解:首先先把阶乘和逆元预处理出来,这样就可O(1)将 ...

  5. libgdx学习记录19——图片动态打包PixmapPacker

    libgdx中,opengl 1.x要求图片长宽必须为2的整次幂,一般有如下解决方法 1. 将opengl 1.x改为opengl 2.0.(libgdx 1.0版本后不支持1.x,当然不存在这个问题 ...

  6. [CF995F]Cowmpany Cowmpensation[树形dp+拉格朗日插值]

    题意 给你一棵树,你要用不超过 \(D\) 的权值给每个节点赋值,保证一个点的权值不小于其子节点,问有多少种合法的方案. \(n\leq 3000, D\leq 10^9\) 分析 如果 \(D\) ...

  7. ElasticSearch查询 第二篇:文档更新

    <ElasticSearch查询>目录导航: ElasticSearch查询 第一篇:搜索API ElasticSearch查询 第二篇:文档更新 ElasticSearch查询 第三篇: ...

  8. 设计模式 笔记 中介者模式 Mediator

    //---------------------------15/04/27---------------------------- //Mediator 中介者模式----对象行为型模式 /* 1:意 ...

  9. jersey2 整合 spring + hibernate + log4j2

    整合 spring jersey2 官方还未正式支持 spring4, 但网上有好多支持方案,折腾了一圈后,还是用了 spring3; pom 添加以下依赖配置 <!-- Spring --&g ...

  10. CentOS 6.8 安装Maven

    1.下载maven安装包到developer文件目录下 2,解压缩maven,命令: -bin.tar.gz 3.配置maven路径到环境变量中 export JAVA_HOME=/usr/java/ ...