倒水问题(Fill,UVA 10603) lrj白书 p202
看着lrj的代码自己敲了一遍,还没调试成功。。。。
有时间再进行完善
/*
状态start到各个状态u1,u2,u3.....
的倒水量分别为u1.dist,u2.dist,u3.dist....
*/
/*
按倒水量递增的顺序去寻找当前状态的v[0],v[1],v[2]是否为d
但是程序实现的时候我们寻找目标水量是根据 ans[d]>0,而不是对每一个状态的v[]进行遍历
为什么这样做呢?当然是因为麻烦,ans[d]>0很直接地说明了v[]有三者之一为d
*/
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std; struct Node{
int v[3],dist;
bool operator <(const Node &u) const{
return dist >u.dist;
}
}; const int maxn=200+5;
int vis[maxn][maxn],cap[3],ans[maxn];//因为只有三只杯子,所以记录前两只杯子的状态即可
void update_ans(const Node &u){
for (int i=0;i<3;i++){
int d=u.v[i];
if(ans[d]<0||u.dist<ans[d]) ans[d]=u.dist;//每次有新的状态时,记录形成d升水所需要的最小倒水量
}
}
void solve(int a,int b,int c,int d){
cap[0]=a;
cap[1]=b;
cap[2]=c;
memset(vis,0,sizeof(vis));//vis[]记录三元组状态是否重复
memset(ans,-1,sizeof(ans));//ans[]记录当前的最小倒水量
priority_queue<Node> q; Node start;
start.dist=0;//总的倒水量
start.v[0]=0;start.v[1]=0;start.v[2]=c;
q.push(start);//准备工作 vis[0][0]=1;//设置初始状态为已访问
/*!当所有状态都被访问完,就算ans[d]<0,while{}也停止
!!当ans[d]>0,表示输出所求的状态已找到,停止循环*/
while (!q.empty()){
Node u=q.top();q.pop();//对优先队列表头(即当前队列结点.dist最小)的结点进行访问
update_ans(u);
if (ans[d]>=0) break;
//从v[i]--v[j]加水,加多少水呢?只要能加,就加到不能加为止
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)if(i!=j){
if(u.v[i]==0||u.v[j]==cap[j]) continue; //过渡到下一个i或下一个j
int amount=min(cap[j],u.v[i])-u.v[j];
Node u2;
memcpy(&u2,&u,sizeof(u));
u2.dist=u.dist+amount;
u2.v[i]-=amount;
u2.v[j]+=amount;
if (!vis[u2.v[0]][u2.v[1]]){
vis[u2.v[0]][u2.v[1]]=1;
q.push(u2);
}
}
} while (d>=0){
if(ans[d]>=0){
printf("%d %d\n",ans[d],d);
return;
}
d--;
}
} int main(){
int T,a,b,c,d;
scanf("d%",&T);
while(T--){
scanf("%d%d%d%d",&a,&b,&c,&d);
solve(a,b,c,d);
}
return 0;
}
倒水问题(Fill,UVA 10603) lrj白书 p202的更多相关文章
- 倒水问题(Fill, UVa 10603)
[题目描述] 有三个没有刻度的水壶,容量分别为a,b和c(单位为升,都是<=200的正整数).初始时前两个水壶是空的,而第三个装满了水.每次可以从一个水壶往一个水壶里倒水,直到一个水壶倒空或者另 ...
- Uva 548 二叉树的递归遍历lrj 白书p155
直接上代码... (另外也可以在递归的时候统计最优解,不过程序稍微复杂一点) #include <iostream> #include <string> #include &l ...
- Uva 122 树的层次遍历 Trees on the level lrj白书 p149
是否可以把树上结点的编号,然后把二叉树存储在数组中呢?很遗憾如果结点在一条链上,那将是2^256个结点 所以需要采用动态结构 首先要读取结点,建立二叉树addnode()+read_input()承担 ...
- 矩阵连乘 LRJ白书 p141 栈 解析表达式
#include<iostream> #include<cstdio> #include<cstring> #include<sstream> #inc ...
- UVa 10603 Fill (BFS && 经典模拟倒水 && 隐式图)
题意 : 有装满水的6升的杯子.空的3升杯子和1升杯子,3个杯子中都没有刻度.不使用道具情况下,是否可量出4升水呢? 你的任务是解决一般性的问题:设3个杯子的容量分别为a, b, c,最初只有第3个杯 ...
- UVA大模拟代码(白书训练计划1)UVA 401,10010,10361,537,409,10878,10815,644,10115,424,10106,465,10494
白书一:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=64609#overview 注意UVA没有PE之类的,如果PE了显示WA. UVA ...
- 白书P61 - 点集配对问题
白书P61 - 点集配对问题 状压DP #include <iostream> #include <cstdio> #include <cstring> using ...
- 白书P60 - 硬币问题
白书P60 - 硬币问题 完全背包.DP #include <iostream> #include <cstdio> #include <cstring> usin ...
- poj2991 Crane(线段树+集合)白书例题
题目大意:起重机有n节,题目给出要调节的k节,每节调节成x度,求最后底部的起重机的坐标(最顶上的起点为(0,0)). 分析:一开始我看白书,看不懂他那个向量旋转的坐标是怎么来的,翻了很多博客,才发现, ...
随机推荐
- jQuery 评分插件(转)
评分效果的小插件jQuery Raty.它提供的API相当丰富真的是让人爱不释手.详细文档及下载插件请移步这里. 基本使用 下面我们来实际操作,运用一下这个有爱的小插件. 需要做的事情非常简单,在页面 ...
- ajax异步加载遮罩层特效
<!doctype html> <html> <head> <title>遮罩层(正在加载中)</title> <meta chars ...
- Spring MVC使用样例
Spring MVC使用样例 步骤1:添加Spring的相关依赖 1 <dependency> 2 3 <groupId>com.alibaba.external</gr ...
- [leetcode-535-Encode and Decode TinyURL]
TinyURL is a URL shortening service where you enter a URL such as https://leetcode.com/problems/desi ...
- [leetcode-541-Reverse String II]
Given a string and an integer k, you need to reverse the first k characters for every 2k characters ...
- 【LeetCode】152. Maximum Product Subarray
题目: Find the contiguous subarray within an array (containing at least one number) which has the larg ...
- Example007关闭窗口时关闭父窗口
<!--实例007关闭窗口时刷新父窗口--> <!DOCTYPE html> <html lang="en"> <head> < ...
- 9.session的生命周期
1.创建 当客户端第一次访问某个jsp或者Servlet的时候,服务器会为当前会话创建一个SessionId,每次客户端向服务端发送请求的时候,都会将此SessionId携带过去,服务端会对此Sess ...
- PouchDB 基础
GUIDES http://pouchdb.com/guides/ 1.建立couchDB环境 下载并安装CouchDB: https://couchdb.apache.org/#download 测 ...
- 处理input标签的border-radius
给input设置border-radius效果时一定要先设置border属性,否则会出现左上部有阴影的效果.