USACO之milk3
来源:互联网 发布:飞鸽传书网络连接失败 编辑:程序博客网 时间:2024/06/08 12:31
【题意】农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满牛奶的。有时,农民把牛奶从一个桶倒到 另一个桶中,直到被灌桶装满或原桶空了。当然每一次灌注都是完全的。由于节约, 牛奶不会有丢失,写一个程序去帮助农民找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性。
【输入】单独的一行包括三个整数A,B和C
【输出】只有一行,升序地列出当A桶是空的时候,C桶牛奶所剩量的所有可能性
【题解】初看这道题时,感觉不太懂,但是抓住一句话,‘’直到被灌桶装满或原桶空了‘’这说明当两个桶交互时,其中一个被灌满或者是空。这样一想就有多种情况了。
/* ID:m1519591 PROG: milk3 LANG:C++*/#include<iostream>#include<fstream>#include<vector>#include<algorithm>using namespace std;const int MAX=22;int a[3]={0}; //此时桶中的牛奶量; //ifstream cin("milk3.in");//ofstream cout("milk3.out");bool vis[MAX][MAX][MAX]={0}; //表明此时3个桶中牛奶的状态。vector<int>ans; //记录结果。 int a0[3]={0}; //桶的容量; void dfs(int a[]){ if(vis[a[0]][a[1]][a[2]])//如果此时的状态被访问过,就返回。 return ; vis[a[0]][a[1]][a[2]]=true; if(a[0]==0) //当A桶中没有牛奶时,记录此时C桶中的牛奶数。 { ans.push_back(a[2]); } for(int i=0;i<=2;i++) { if(a[i]) //i桶中有牛奶可以向其他桶中倒牛奶。 { for(int j=0;j<=2;j++) { if(i!=j) { int m=min(a[i],a0[j]-a[j]); a[i]-=m; a[j]+=m; if(!vis[a[0]][a[1]][a[2]]) { dfs(a); //将这种状态进行到底 //直到a[0]==0; } a[i]+=m; a[j]-=m; } } } } }int main(){ cin>>a0[0]>>a0[1]>>a0[2]; a[0]=0; a[1]=0; a[2]=a0[2]; dfs(a); sort(ans.begin(),ans.end()); int i; for(i=0;i<=ans.size()-2;i++) cout<<ans[i]<<" "; cout<<ans[i]<<endl; return 0;}
阅读全文
0 0
- USACO之milk3
- usaco milk3
- usaco milk3
- usaco milk3
- usaco——milk3
- USACO milk3 DFS
- usaco 1.4.2 milk3
- usaco 1.4 milk3 2008.11.5
- USACO-Section1.4 milk3[深搜]
- USACO 1.4 Mother's Milk (milk3)
- 1.4 milk3 倒牛奶
- section 1.4 milk3
- milk3-section1.4
- 开始USACO之旅
- USACO之旅-d2
- USACO OI之策略
- USACO之Mixing Milk
- USACO之Prime Cryptarithm
- 离散题目3(判断是否为子集)
- linux驱动调试之自制工具—寄存器编辑器
- 算法设计与应用基础
- libcurl with zlib 动态库 在 VS 下的编译
- 使用文献管理软件Mendeley插入参考文献和引用
- USACO之milk3
- 37 WebGL多个模型组成一个复杂的模型
- C++ 02 —— 访问权限
- SpringMVC的拦截器(Interceptor)和过滤器(Filter)的区别与联系
- 一个创建工程目录的shell脚本
- linux驱动调试之段错误分析_根据pc值确定出错的代码位置
- 索引
- 递归解决最长公共子序列问题(LCS)
- QT [007] QT UI 的控件操控问题