UVA - 10603 Fill(隐式图搜索)
2015-08-20 23:52
417 查看
题目大意:经典的倒水问题。给你三个瓶子,体积为a,b,c。
刚开始a,b是空的,c是满的,现在要求你到出体积为d的水。倒水的规则为,要么倒水方为空,要么接水方满
问倒到容量为d时,倒水的最小体积是多少,如果不能倒出体积为d的水,找出d’ < d,最接近d的d’和最小的体积
解题思路:刚才时以为直接bfs,用vis标记一下就结束了,结果WA了。为什么会WA,因为我这样求的是倒水次数最少的,而不是倒水体积最小的,WA是肯定的了
接着将vis数组改成int型的,纪录达到这个状态时倒水的体积,结果可想而之TLE(可能是我写搓了。。)
借鉴了一下别人的,恍然大悟,用一个数组代表倒出这个体积的水时倒的水的最小体积,这样就可以减少很多种情况了,确实是一个大剪枝
刚开始a,b是空的,c是满的,现在要求你到出体积为d的水。倒水的规则为,要么倒水方为空,要么接水方满
问倒到容量为d时,倒水的最小体积是多少,如果不能倒出体积为d的水,找出d’ < d,最接近d的d’和最小的体积
解题思路:刚才时以为直接bfs,用vis标记一下就结束了,结果WA了。为什么会WA,因为我这样求的是倒水次数最少的,而不是倒水体积最小的,WA是肯定的了
接着将vis数组改成int型的,纪录达到这个状态时倒水的体积,结果可想而之TLE(可能是我写搓了。。)
借鉴了一下别人的,恍然大悟,用一个数组代表倒出这个体积的水时倒的水的最小体积,这样就可以减少很多种情况了,确实是一个大剪枝
[code]#include <cstdio> #include <cstring> #include <queue> using namespace std; #define N 210 #define INF 0x3f3f3f3f struct Node{ int have[3]; int d; }n1, n2; int done , val[3]; int d; bool vis ; void init() { memset(vis, 0, sizeof(vis)); memset(done, 0x3f, sizeof(done)); scanf("%d%d%d%d", &val[0], &val[1], &val[2], &d); done[0] = done[val[2]] = 0; } void bfs() { queue<Node> Q; vis[0][0] = true; n1.have[0] = n1.have[1] = n1.d = 0; n1.have[2] = val[2]; Q.push(n1); while (!Q.empty()) { n1 = Q.front(); Q.pop(); for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) { if (i ^ j) { n2 = n1; int tmp = val[j] - n2.have[j] < n2.have[i] ? val[j] - n2.have[j] : n2.have[i]; n2.have[j] += tmp; n2.have[i] -= tmp; n2.d += tmp; if (!vis[n2.have[0]][n2.have[1]] || done[n2.have[0]] > n2.d || done[n2.have[1]] > n2.d || done[n2.have[2]] > n2.d) { vis[n2.have[0]][n2.have[1]] = true; for (int k = 0; k < 3; k++) { done[n2.have[k]] = min(done[n2.have[k]], n2.d); } Q.push(n2); } } } } } void solve() { bfs(); for (int i = d; i >= 0; i--) if (done[i] != INF) { printf("%d %d\n", done[i], i); break; } } int main() { int test; scanf("%d", &test); while (test--) { init(); solve(); } return 0; }
相关文章推荐
- 集成Dubbo服务(Spring)
- 8月份书单
- Web服务器
- 【面试题之算法部分】LIS最长递增子序列
- Opencv的Canny边缘检测
- 使用sh执行bash脚本的奇怪问题
- 8.20总结
- Timber
- Oracle(+)号用法
- JQuery中Ajax的操作
- Java集合概述
- 部分真题整理2
- delphi将图片存储到sql server 2005
- python 装饰器及标准库functools中的wraps
- #310 (div.2) D. Case of Fugitive
- ARP请求重播攻击
- delphi将汉字转为首字母
- Opencv读取并播放视频
- 【bzoj1072】【SCOI2007】【排列perm】【状压dp】
- BAT职级薪酬深度分析