题目大意:经典的倒水问题。

给你三个瓶子,体积为a,b,c。

刚開始a。b是空的,c是满的,如今要求你到出体积为d的水。倒水的规则为,要么倒水方为空,要么接水方满

问倒到容量为d时,倒水的最小体积是多少。假设不能倒出体积为d的水,找出d’ < d,最接近d的d’和最小的体积

解题思路:刚才时以为直接bfs,用vis标记一下就结束了,结果WA了。为什么会WA。由于我这样求的是倒水次数最少的,而不是倒水体积最小的,WA是肯定的了

接着将vis数组改成int型的,纪录达到这个状态时倒水的体积。结果可想而之TLE(可能是我写搓了。。)

借鉴了一下别人的,恍然大悟,用一个数组代表倒出这个体积的水时倒的水的最小体积,这样就能够降低非常多种情况了,确实是一个大剪枝

#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[N], val[3];
int d;
bool vis[N][N]; 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;
}

UVA - 10603 Fill(隐式图搜索)的更多相关文章

  1. uva 310 L--system(隐式图搜索+字符串处理)

     L-system  A D0L (Deterministic Lindenmayer system without interaction) system consists of a finite ...

  2. UVa 658 - It's not a Bug, it's a Feature!(Dijkstra + 隐式图搜索)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  3. uva 10274 Fans and Gems(隐式图搜索+模拟)

    Fans and Gems Input: Standard Input Output: Standard Output Tomy's fond of a game called 'Fans and G ...

  4. 紫书 例题 11-6 UVa 658 (状态压缩+隐式图搜索+最短路)

    这道题用到了很多知识点, 是一道好题目.      第一用了状态压缩, 因为这里最多只有20位, 所以可以用二进制来储存状态 (要对数据范围敏感), 然后 涉及到了一些位运算.     第二这里是隐式 ...

  5. 【uva 658】It's not a Bug, it's a Feature!(图论--Dijkstra或spfa算法+二进制表示+类“隐式图搜索”)

    题意:有N个潜在的bug和m个补丁,每个补丁用长为N的字符串表示.首先输入bug数目以及补丁数目.然后就是对M个补丁的描述,共有M行.每行首先是一个整数,表明打该补丁所需要的时间.然后是两个字符串,第 ...

  6. [HNOI2006]最短母串问题 --- AC自动机 + 隐式图搜索

    [HNOI2006]最短母串问题 题目描述: 给定n个字符串(S1,S2.....,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,......,Sn)都是T的子串. 输入格式: 第 ...

  7. 洛谷 P2622 关灯问题II【状压DP;隐式图搜索】

    题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯--按下了第i个按钮,对于所有的灯都有一个效果.按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j]为1,那么当这盏灯开了的时 ...

  8. UVa 10603 Fill [暴力枚举、路径搜索]

    10603 Fill There are three jugs with a volume of a, b and c liters. (a, b, and c are positive intege ...

  9. UVa 10603 Fill (BFS && 经典模拟倒水 && 隐式图)

    题意 : 有装满水的6升的杯子.空的3升杯子和1升杯子,3个杯子中都没有刻度.不使用道具情况下,是否可量出4升水呢? 你的任务是解决一般性的问题:设3个杯子的容量分别为a, b, c,最初只有第3个杯 ...

随机推荐

  1. JS手风琴特效

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  2. 【Luogu】P1472奶牛家谱(DP)

    题目链接 这是一道考思维的好题. 一开始设f[i][j]是i个点刚好j层的方案数,死活调不出来,看题解发现可以改为<=j层的方案数,最后输出f[n][m]-f[n][m-1]就好了. 对于计算考 ...

  3. HDU——5667Sequence(矩阵快速幂+费马小定理应用)

    Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total S ...

  4. ACM程序设计选修课——Problem F:(ds:图)旅游规划(优先队列+SPFA)

    问题 F: (ds:图)旅游规划 时间限制: 1 Sec  内存限制: 128 MB 提交: 14  解决: 4 题目描述 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路 ...

  5. HDU——2723Electronic Document Security(STL map嵌套set做法)

    Electronic Document Security Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ( ...

  6. 需要打印真实尺寸大小等需求的,css的单位可以使用mm等做单位

    今天甲方那边改需求了,要求打印出来的尺寸是85mm/55mm的,开始还一直在网上找px和mm的相关换算,结果去w3c看了,竟然还有mm单位的, 在这里做个笔记

  7. C# 数据库写入Sql Bulk索引损坏异常问题System.InvalidOperationException: DataTable internal index is corrupted: '4'

    C# 数据库写入Sql Bulk索引损坏异常问题 System.InvalidOperationException: DataTable internal index is corrupted: '4 ...

  8. bzoj 1857 三分套三分

    题目大意 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R.现在lxh ...

  9. ckeditor小记

    widget 只要创建都会执行 init函数,可以绑定事件,但是如果widget释放了,其上绑定的时间也就没有了

  10. 45深入理解C指针之---指针释放

    一.size_t:用于安全表示长度,所有平台和系统都会解析成自己对应的长度 1.定义:size_t类型表示C中任何对象所能表示的最大长度,是个无符号整数:常常定义在stdio.h或stdlib.h中 ...