USACO Section 1.4 Mother's Milk 解题报告
题目
题目描述
有三个牛奶桶,三个桶的容积分别是A,B,C,最小为1,最大为20。刚开始只有第三个桶里面装满了牛奶,其余两个桶都是空的。我们现在可以将第三个桶中的牛奶往其他两个桶里面倒一些牛奶,然后还可以将其他两个桶往另一个桶中倒牛奶,但是我们在操作的时候有严格的要求:
从一个桶往另一个桶中倒牛奶,要么直到第二个桶已经装满了,要么直到第一个桶已经空了。在倒牛奶的过程中不允许浪费。
在来回经过一系列的倒牛奶的操作之后,现在我们需要知道当第一个牛奶桶为空的时候,第三个牛奶桶可能的牛奶量为多少。
输入
一行输入三个整数 A,B,C。
输出
按照从小到大的顺序输出当第一个桶为空时第三个桶中的可能牛奶量。
输入样例
8 9 10
输出样例
1 2 8 9 10
输入样例
2 5 10
输出样例
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,我们只要将这六种操作模拟出来就行了。
代码
/*
ID: yinzong2
PROG: milk3
LANG: C++11
*/
#define MARK
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 21;
int A,B,C;
int states[maxn][maxn][maxn];
void solve(int a, int b, int c);
void next(int x, int y, int z) {
if (!states[x][y][z]) {
states[x][y][z] = true;
solve(x, y, z);
}
}
// 枚举所有的可能状态,如果某个状态已经到达过,那么就不需要处理它
void solve(int a, int b, int c) {
int x, y, z;
// A->B
x = 0; y = a+b; z = c;
if (y > B) {
x = y-B;
y = B;
}
next(x, y, z);
// A->C;
x = 0; y = b; z = a+c;
if (z > C) {
x = z-C;
z = C;
}
next(x, y, z);
// B->A
x = a+b; y = 0; z = c;
if (x > A) {
y = x-A;
x = A;
}
next(x, y, z);
// B->C
x = a; y = 0; z = b+c;
if (z > C) {
y = z-C;
z = C;
}
next(x, y, z);
// C->A
x = a+c; y = b; z = 0;
if (x > A) {
z = x-A;
x = A;
}
next(x, y, z);
// C->B
x = a; y = b+c; z = 0;
if (y > B) {
z = y-B;
y = B;
}
next(x, y, z);
}
int main() {
#ifdef MARK
freopen("milk3.in", "r", stdin);
freopen("milk3.out", "w", stdout);
#endif // MARK
while (cin >> A >> B >> C) {
memset(states, false, sizeof(states));
states[0][0][C] = true;
solve(0, 0, C);
bool first = true;
for (int c = 0; c <= C; ++c) {
if (states[0][C-c][c]) {
if (!first) cout << " ";
cout << c;
first = false;
}
}
cout << endl;
}
return 0;
}
USACO Section 1.4 Mother's Milk 解题报告的更多相关文章
- USACO Section1.4 Mother's Milk 解题报告
milk3解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...
- USACO Section 1.3 Ski Course Design 解题报告
题目 题目描述 有N座山,每座山都有一个高度,现在由于农夫想避税,所以想把这些山的高度进行一些改变,使得最高的山与最低的山之间的高度差不超过17.每座山最多只能改变一次高度,每次改变高度都会产生一定的 ...
- USACO Section 1.2 Name That Number 解题报告
题目 题目描述 在一个农场里面,每一头牛都有一个数字编号,但是现在这些牛不喜欢这种编号,它们想把这些数字编号转化成为可以接受的字母的形式.数字与字母的转换表如下: 2: A,B,C 5: J,K,L ...
- USACO Section 1.1 Friday the Thirteenth 解题报告
题目 题目描述 黑色星期五是否真的是一件不同寻常的事情?按理来说每个月的13号可能是星期一,或者是星期二...或者是星期天,但是黑色星期五的存在让我们不禁开始猜想,难道每个月的13号刚好是星期五的频率 ...
- USACO Section 1.1 Greedy Gift Givers 解题报告
题目 问题描述 有若干个朋友,朋友之间可以选择互相赠送一些有价值的礼物.一个人可以选择将一部分钱分给若干个朋友,例如某人送给其他两个人钱,总共赠送3元,两个人平均分,原本应该是每人1.5元,但是只能取 ...
- USACO Section1.3 Mixing Milk 解题报告
milk解题报告 —— icedream61 博客园(转载请注明出处)----------------------------------------------------------------- ...
- USACO Section2.1 Sorting a Three-Valued Sequence 解题报告
sort3解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...
- USACO Section 1.3 Mixing Milk 解题报告
题目 题目描述 Merry Milk Makers 公司的业务是销售牛奶.它从农夫那里收购N单位的牛奶,然后销售出去.现在有M个农夫,每个农夫都存有一定量的牛奶,而且每个农夫都会有自己的定价.假设所有 ...
- Section 1.4 Mother's Milk
又是一道怨念已久的题目0 0之前深搜写过广搜写过,怎么就是卡死,我还以为FP坏了重新装了一遍.今天偶尔翻起来,发现广搜忘记inc(head)了…简直哭瞎… 简单的广搜,分类比较多,不过不太要动脑子.至 ...
随机推荐
- ubuntu14.04安装jupyter notebook
1.使用pip安装Jupyter notebook: pip install jupyter notebook 2.创建Jupyter默认配置文件: jupyter notebook --genera ...
- 20155331《网络对抗》 Exp9 Web安全基础
20155331<网络对抗> Exp9 Web安全基础 实验过程 WebGoat 在终端中输入java -jar webgoat-container-7.0.1-war-exec.jar开 ...
- 第五节 HTML&CSS -- 关于浮动和清除浮动的解说,以及两个大坑不要踩
1.随便唠叨几句 这一节课我会对浮动元素和怎样清除浮动相关的技术进行一个讲解,同时,我会列举一些我们前端开发中常见的坑,希望大家以后不要在这些地方犯错.在开始今天的课程之前,有一个东西我需要先讲一 ...
- [图片生成]使用VAEs生成新图片
变分自动编码器生成图片 从隐图像空间进行采样以创建全新的图像或编辑现有图像是目前创作AI最受欢迎和最成功的应用方式. 图像隐空间取样 图像生成的关键思想是开发表示的低维潜在空间(自然是矢量空间),其中 ...
- scala学习——(1)scala基础(上)
scala> val x = 1 x: Int = 1 一.值与变量 值(val):赋值后不可变 val值名称:类型 = XXX 变量(var):赋值后可以改变 var变量名称:类型 = XX ...
- R实战 第八篇:重塑数据(reshape2)
数据重塑通常使用reshape2包,reshape2包用于实现对宽数据及长数据之间的相互转换,由于reshape2包不在R的默认安装包列表中,在第一次使用之前,需要安装和引用: install.pac ...
- 真机调试傻瓜图文教程(Xcode6.4)
先准备好99刀,真机调试才带你玩. PS:万能宝十来块钱可以买个资格... Developer Apple上的设置 1.打开https://developer.apple.com/,点击Member ...
- nvm管理不同版本的node和npm
写在前面 nvm(nodejs version manager)是nodejs的管理工具,如果你需要快速更新node版本,并且不覆盖之前的版本:或者想要在不同的node版本之间进行切换:使用nvm来安 ...
- 【DDD】业务建模实践 —— 发布帖子
本文是基于上一篇‘业务建模战术’的实践,主要讲解‘发表帖子’场景的业务建模,包括:业务建模.业务模型.示例代码:示例代码会使用java编写,文末附有github地址.相比于<领域驱动设计> ...
- fis入门-单文件编译之文件优化(optimize)
FIS(Front-end Integrated Solution ),是百度的前端集成解决方案.最近几天在研究前端构建的东西,就顺便了解了下,果断各种高大上,可以到FIS官网围观感受一下.如果对fi ...