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)了…简直哭瞎… 简单的广搜,分类比较多,不过不太要动脑子.至 ...
随机推荐
- Spark内部流程图
转载自:https://blog.csdn.net/refuil/article/details/52055104
- mfc CIPAddressCtrl控件
知识点: CIPAddressCtrl 属性 CIPAddressCtrl 成员函数 成员函数代码测试 一.CIPAddressCtrl Class Members IsBlank Determine ...
- OpenCV学习C++接口 Mat像素遍历详解
OpenCV学习C++接口 Mat像素遍历详解
- TMS320VC5509的MCBSP配置成SPI模式通信
1. 首先是把MCBSP的配置 其次是时钟停止模式的配置,关闭大同小异 SPI有4中模式,怎么根据上面的寄存器选择哪种模式?下面展示了其中两种,CLKXP=1的时候有另外两种,暂时不整出来了 2. 代 ...
- Lambda学习---方法引用和其他基本应用
package com.zx; import java.util.*; import java.util.function.*; import java.util.stream.Collectors; ...
- Vue重载组件....
v-if配合Vue.nextTick()销毁当前组件后,重新加载...
- 前端项目模块化的实践2:使用 Webpack 打包基础设施代码
以下是关于前端项目模块化的实践,包含以下内容: 搭建 NPM 私有仓库管理源码及依赖: 使用 Webpack 打包基础设施代码: 使用 TypeScript 编写可靠类库 使用 TypeScript ...
- Jq_javascript跨域问题
为什么浏览器不能跨域 现在很多人特别是前端开发人员,在ajax请求,XMLHttpRequest的过程中会碰到一个问题,那就是跨域请求: 当我们javaScript脚本试图跨域访问时,浏览器会告诉 ...
- Jenkins 构建运行java程序
我们将在Jenkins建立执行一个简单的 HelloWorld 应用程序,构建和运行Java程序.打开网址:http://localhost:8080/jenkins 第1步- 转到Jenkins 仪 ...
- 转载别人的一篇关于git的文章
转载网址:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000