UVA - 10603 Fill(隐式图搜索)
题目大意:经典的倒水问题。
给你三个瓶子,体积为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(隐式图搜索)的更多相关文章
- uva 310 L--system(隐式图搜索+字符串处理)
L-system A D0L (Deterministic Lindenmayer system without interaction) system consists of a finite ...
- 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& ...
- uva 10274 Fans and Gems(隐式图搜索+模拟)
Fans and Gems Input: Standard Input Output: Standard Output Tomy's fond of a game called 'Fans and G ...
- 紫书 例题 11-6 UVa 658 (状态压缩+隐式图搜索+最短路)
这道题用到了很多知识点, 是一道好题目. 第一用了状态压缩, 因为这里最多只有20位, 所以可以用二进制来储存状态 (要对数据范围敏感), 然后 涉及到了一些位运算. 第二这里是隐式 ...
- 【uva 658】It's not a Bug, it's a Feature!(图论--Dijkstra或spfa算法+二进制表示+类“隐式图搜索”)
题意:有N个潜在的bug和m个补丁,每个补丁用长为N的字符串表示.首先输入bug数目以及补丁数目.然后就是对M个补丁的描述,共有M行.每行首先是一个整数,表明打该补丁所需要的时间.然后是两个字符串,第 ...
- [HNOI2006]最短母串问题 --- AC自动机 + 隐式图搜索
[HNOI2006]最短母串问题 题目描述: 给定n个字符串(S1,S2.....,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,......,Sn)都是T的子串. 输入格式: 第 ...
- 洛谷 P2622 关灯问题II【状压DP;隐式图搜索】
题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯--按下了第i个按钮,对于所有的灯都有一个效果.按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j]为1,那么当这盏灯开了的时 ...
- 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 ...
- UVa 10603 Fill (BFS && 经典模拟倒水 && 隐式图)
题意 : 有装满水的6升的杯子.空的3升杯子和1升杯子,3个杯子中都没有刻度.不使用道具情况下,是否可量出4升水呢? 你的任务是解决一般性的问题:设3个杯子的容量分别为a, b, c,最初只有第3个杯 ...
随机推荐
- 关于 NSData 的数据类型(2进制,16进制之间)及深入剖析
1. NSData 与 NSString NSData-> NSString NSString *aString = [[NSString alloc initWithData:adataenc ...
- 02_ThreadLocal语法与源码分析
文章导读: 早在JDK 1.2的版本中就提供Java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程 ...
- tomcat6-endpoint设计
之前写的一个ppt 搬到博客来
- Redhat7配置yum源(本地源和网络源)
Redhat7配置yum源(本地源和网络源) 目录 一:配置本地yum源 二:配置网络yum源 YUM(Yellow dog Updater Modified): yum是基于RPM包构建的软件更 ...
- Leetcode3--->无重复字符的最长子串长度
题目:给定一个字符串string,找出string中无重复字符的最长子串. 举例: Given "abcabcbb", the answer is "abc", ...
- linux随笔四
1.ps -ef : -e 显示系统上运行的所有进程,-f 显示一些有用的信息列 UID:负责启动进程的用户 PID:进程的ID PPID:父进程的PID(某个进程由另一个进程启动) C: ...
- Python学习-day5 常用模块
day5主要是各种常用模块的学习 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 conf ...
- PHP下mysql驱动概述
Overview of the MySQL PHP drivers 什么是API? 一 个应用程序接口(Application Programming Interface的缩写),定义了类,方法,函数 ...
- 什么是WSDL
WSDL定义 WSDL(Web Service Description Language) 指网络服务描述语言:是一种用来描述Web服务和说明Web服务通信的XML.WSDL用于描述WebServic ...
- 关于php ‘==’ 与 '===' 遇见的坑
两个的区别所有PHPer都知道, 今天在遍历 xmlNode时,自己写的代码就碰坑了 想遍历xmlNode为数组 得到的xmlNode为 想要把所有的simpleXmlElement对象都遍历转成数组 ...