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)了…简直哭瞎… 简单的广搜,分类比较多,不过不太要动脑子.至 ... 
随机推荐
- Multi account chang login with multi -thread
			void worker_DoWork(object sender, DoWorkEventArgs e) { isBussy = true; if (Common.isChangingAccount) ... 
- Java 多线程之 Thread 类 和 Runnable 接口初步使用
			目录 Thread 类 Thread之定义线程类 Thread之开启线程 Runnable 接口 Runnable 之定义线程类 Runnable 之开启线程 @ Thread 类 Thread 类是 ... 
- Python中浅拷贝和深拷贝的区别总结与理解
			单层浅拷贝 import copy a = 1 # 不可变数据类型 copy_a = copy.copy(a) print(id(a),id(copy_a)) # 内存地址相同 a = [1,2] # ... 
- spring boot 2.0 源码分析(二)
			在上一章学习了spring boot 2.0启动的大概流程以后,今天我们来深挖一下SpringApplication实例变量的run函数. 先把这段run函数的代码贴出来: /** * Run the ... 
- Python在函数中使用*和**接收元组和列表
			http://blog.csdn.net/delphiwcdj/article/details/5746560 
- c# 简易绘制C语言头文件包含关系图
			最近在做一个项目的移植工作,项目很大,光c文件大约有1800多.由于某些需要,想要对某些代码文件引用的.h文件进行分析. 网上找了好久,暂无发现类似的工具. 正好,今天放假,就做了这么个工具. 好了, ... 
- 2018软工实践—Beta冲刺(7)
			队名 火箭少男100 组长博客 林燊大哥 作业博客 Beta 冲鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调组内工作 整体软件测试 展示GitHub当日代码/文档签入记录(组 ... 
- 3D 立体 backface-visibility
			<!DOCTYPE html> <html> <head> <!-- backface-visibility属性用来设置,是否显示元素的背面,默认是显示的 b ... 
- Yii框架的原代码
			http://www.digpage.com/app_struct.html#index-php 
- vue   请求后台数据   (copy)
			https://www.cnblogs.com/calledspeed001/p/7094494.html var that=this get请求 that.$http.get("1.txt ... 
