UVA 10603 Fill(正确代码尽管非常搓,网上很多代码都不能AC)
题目链接: option=com_onlinejudge&Itemid=8&page=show_problem&problem=1544">click here~
此题我预计是加强过数据,在我纠结了非常久的时候我交了好几份网上的代码不是WA就是TLE。在我非常迷茫的时候我又交了一份,AC了(尽管我用随机数据找到了他代码一个不能过的数据)。
给了我信心。然后我拿他的代码用随机数跟我的代码进行測试。再用FC找不同。。发现了一个致命的错误。一般来说,BFS或者DFS都是须要有一个vis数组或者哈希来判重,可是此题判重是有非常大问题的,相同对于3个水杯的状态,在3步下或许流量是50,然后这个状态被标记,5步的时候又出现了这个状态(能够理解为还有一个分支),可是流量却是35,假设用个二维数组判重(没有必要用三维的,由于和是一样的,二维就能够了),那么这个状态的流量就不会更新。题目的意思却是说要用最小的流量去到达这个状态,无论是得到终于的目标还是比目标小近期目标的状态。
所以我感觉这题的标准解法应该不是 bfs,由于能够说是算暴力了。每一次的状态(假设流量比上一个到这个状态的流量少)都须要更新,不断更新直到最后。
在uva toolkit上此题的思路是dp或dijkstra。这2样还没怎么搞不太会。建图也想不到想法。感觉就算建了还是搜索的东西啊
尽管A了,可是感觉不爽啊。另外我找的那个A了的代码没过的数据是:33 12 113 6
他的结论是 174 6,我的结论是171 6,在uva toolkit上也是我的答案。可是我认为他的思路应该是正确的,没细看。。实在是太长了。
假设有想法的欢迎留言。
代码供參考:
#include<cstdio>
#include<ctype.h>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<stack>
#include<cmath>
#include<queue>
#include<set>
using namespace std;
#define ll long long
#define NMAX 20000
typedef int state[3];
state st[NMAX],a;
int pour[NMAX];
int record[205];
int target;
int vis[205][205],vispour[205][205];
int try_to_insert(int x,int tpour)
{
state &k = st[x];
if(vis[k[0]][k[1]] != 1 || vispour[k[0]][k[1]] > tpour)
{
vis[k[0]][k[1]] = 1;
vispour[k[0]][k[1]] = tpour;
return 1;
}
return 0;
}
int main()
{
// freopen("input.txt","r",stdin);
// freopen("o.txt","w",stdout);
int i,j,t,ans;
scanf("%d",&t);
while(t--)
{
memset(record,0,sizeof(record));
memset(vis,0,sizeof(vis));
memset(vispour,0,sizeof(vis));
scanf("%d%d%d%d",&a[0],&a[1],&a[2],&target);
st[1][0] = st[1][1] = 0;
st[1][2] = a[2];
memset(pour,0,sizeof(pour));
record[a[2]] = 1;
int front = 1,rear = 2;
vis[0][0] = 1;
bool flag = false;
while(front < rear)
{
for(i = 0; i < 3; i++)
if(record[st[front][i]] == 0 || pour[record[st[front][i]]] > pour[front])
record[st[front][i]] = front;
for(i = 0; i < 3; i++)
if(st[front][i] == target)
{
if(flag)
ans = pour[ans] > pour[front]?front:ans;
else
ans = front;
flag = true;
break;
}
for(i = 0; i < 3; i++)
{
state &w = st[front];
if(w[i] != 0)
{
for(j = 0; j < 3; j++)
{
if(i == j || (i != j && w[j] == a[j])) continue;
state &temp = st[rear];
memcpy(temp,w,sizeof(w));
int pp;
if(w[i] + w[j] > a[j])
{
pp = a[j] - w[j];
temp[i] = w[i] - pp;
temp[j] = a[j];
}
else
{
pp = w[i];
temp[i] = 0;
temp[j] = w[j] + pp;
}
int tpour;
tpour = pour[front] + pp;
if(try_to_insert(rear,tpour))
{
pour[rear] = tpour;
rear++;
}
}
}
}
front++;
}
if(record[target] == 0)
{
for(i = target; record[i] == 0; i--);
printf("%d %d\n",pour[record[i]],i);
}
else printf("%d %d\n",pour[ans],target);
}
return 0;
}
UVA 10603 Fill(正确代码尽管非常搓,网上很多代码都不能AC)的更多相关文章
- 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
如家大神书上的例题.第一次接触也是按代码敲得.敲的过程感觉很直观.但自己写估计会写的乱七八糟.以后不能砍得难就不愿意做这种题.否则只能做一些水题了.(PS:48) 紫书 #include<ios ...
- UVA 10603 Fill
题意: 题目的意思是倒水,给出的四个数据是第一个水杯,第二个水杯,第三个水杯,和目标水量.一开始只有第三个水杯是满的,剩下的水杯是空的.倒水的时候只能把倒水出来的这个杯子倒空,或是倒水进去的杯子倒满. ...
- UVa 10603 Fill (暴力BFS+优先队列)
题意:给定4个数,a,b,c,d,分别代表空杯子容积为a,b,一个盛满水的杯子容积为c,让你不断倒水,找一个dd,是不是存在某个时刻, 某个杯子里的水dd,和d相同,或者无限接近.让求最少的倒水量和d ...
- UVA - 10603 Fill(隐式图搜索)
题目大意:经典的倒水问题. 给你三个瓶子,体积为a,b,c. 刚開始a.b是空的,c是满的,如今要求你到出体积为d的水.倒水的规则为,要么倒水方为空,要么接水方满 问倒到容量为d时,倒水的最小体积是多 ...
- UVA - 10603 Fill(BFS求最小值问题)
题目: 给出三个杯子(没有刻度线)的容量,起初之后第三个杯子是满的,其他的两个杯子是空的,容量分别是a.b.c.问最少需要倒多少升水才能让某一个杯子中的水有d升?如果不能恰好做到d升,就让某一个杯子里 ...
- UVA 10603 - Fill BFS~
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&c ...
- UVa 10603 Fill (BFS && 经典模拟倒水 && 隐式图)
题意 : 有装满水的6升的杯子.空的3升杯子和1升杯子,3个杯子中都没有刻度.不使用道具情况下,是否可量出4升水呢? 你的任务是解决一般性的问题:设3个杯子的容量分别为a, b, c,最初只有第3个杯 ...
- 如何正确的加载和执行 JavaScript 代码
无论当前 JavaScript 代码是内嵌还是在外链文件中,页面的下载和渲染都必须停下来等待脚本执行完成.JavaScript 执行过程耗时越久,浏览器等待响应用户输入的时间就越长.浏览器在下载和执行 ...
随机推荐
- Trie三兄弟——标准Trie、压缩Trie、后缀Trie
1.Trie导引 Trie树是一种基于树的数据结构,又称单词查找树.前缀树,字典树,是一种哈希树的变种.应用于字符串的统计与排序,经常被搜索引擎系统用于文本词频统计.用于存储字符串以便支持快速模式匹配 ...
- 面试题:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字
题目:给定一个长度为N的数组,其中每个元素的取值范围都是1到N.判断数组中是否有重复的数字.(原数组不必保留) 方法1.对数组进行排序(快速,堆),然后比较相邻的元素是否相同.时间复杂度为O(nlog ...
- 特殊集合(stack、queue、hashtable的示例及练习)
特殊集合:stack,queue,hashtable stack:先进后出,一个一个的赋值一个一个的取值,按照顺序. .count 取集合内元素的个数 .push() ...
- Flash Builder常用快捷键
红色为常用 Ctrl-Shift-O - Organize imports,去除无用的导入类 Ctrl+F11 - 运行(在浏览器浏览) F11 - 调试 Alt+/ - 内容辅助 Ctrl+Alt+ ...
- 基于maven插件的缓存控制插件
asset-cache-control github源码及下载地址: https://github.com/StruggleBird/asset-cache-control 基于maven插件的缓存控 ...
- linux串口编程(c)
//linux c: 串口设置//串口操作无非以下几个://1 打开 //2 设置串口属性//3 read write //struct termios能够 ...
- [LeetCode]题解(python):018-4Sum
题目来源: https://leetcode.com/problems/4sum/ 题意分析: 这道题目和3Sum的题目类似,找出所有的4个数,使得这4个数等于target. 题目思路: 这道题做法和 ...
- IOS-图片操作集合
编辑图片的几个方法 第一种 先用UIImage对象加载一张图片 然后转化成CGImageRef放到CGContext中去编辑 第二种 用CGImageCreate函数创建CGImageRef 然后把 ...
- ceph增加osd流程
假如需要新增一个主机名:osd4 ip:192.168.0.110的OSD1.在osd4创建挂载目录及放置配置文件的目录 ssh 192.168.0.110 (这里是从mon主机ssh到osd4主机) ...
- ThinkPHP - 每个操作都检测用户是否登录
TP提供了一个自动执行的函数_initialize(), 你创建一个公共控制器CommonAction.class.php文件. 定义了此方法,不能存在构造方法__construct() <?p ...