UVA
来源:互联网 发布:mac版utorrent 编辑:程序博客网 时间:2024/06/16 06:45
10603 - Fill
题目链接:点击打开
题意:
有三个水杯,体积为a,b,c,前两个为空水杯,第三个装满水。要得到d体积的水,如果不可能得到,则得到小于d并且最接近d体积的水d'。需要记录你倒过的水的总体积pour,在保证d'最接近d的前提下使得pour尽量小。最后输出pour和d'。
题解:
用bfs搜出所有可能的状态,搜的方法不难,但比较繁琐,一定要多检查几遍。用vis数组标记状态。一开始想的是用一个四维数组分别标记a,b,c,pour(不能漏掉这个),但是肯定存不下,所以就想到用优先队列,pour小的优先,这样就不用标记pour了,因为pour最小的vis[a][b][c]状态已经入队了,pour较大的肯定就不用入队了。
因为你还要得到d'且d'不一定等于d,所以你要把每一次的d'值存起来,并且把其对应的pour值也存起来。最后找到最接近d的d'和较小的pour。我用了一个优先队列来存储。
举个例子:
比如要从A往B中倒水。
if(A杯不为空 && B杯没有满)
if(A能把B杯装满)
则此时A杯中还剩a+b-B,B杯中已装满,为B
if(A不能把B杯装满)
则此时A杯中没有水,B杯中有a+b体积的水
#include<stdio.h>#include<string.h>#include<algorithm>#include<queue>using namespace std;int a,b,c,d;bool vis[210][210][210];struct node{ int a,b,c,pour; bool operator <(node a)const { return pour>a.pour; }};struct ans{ int maxd,pour; bool operator <(ans a)const { return maxd==a.maxd? pour>a.pour:maxd<a.maxd; }}res;node getnode(int aa,int bb,int cc,int pour){ node p; p.a=aa; p.b=bb; p.c=cc; p.pour=pour; return p;}int getmaxd(int aa,int bb,int cc){ int mm=0; if(aa<=d && aa>mm) mm=aa; if(bb<=d && bb>mm) mm=bb; if(cc<=d && cc>mm) mm=cc; return mm;}void bfs(){ memset(vis,0,sizeof(vis)); priority_queue<node> q; priority_queue<ans> pq; vis[0][0][c]=1; q.push(getnode(0,0,c,0)); while(!q.empty()) { node top=q.top(); q.pop(); res.maxd=getmaxd(top.a,top.b,top.c); res.pour=top.pour; pq.push(res); if(top.c && top.a<a)//c->a { if(top.c+top.a>a && !vis[a][top.b][top.c+top.a-a]) { vis[a][top.b][top.c+top.a-a]=1; q.push(getnode(a,top.b,top.c+top.a-a,top.pour+a-top.a)); } if(top.c+top.a<=a && !vis[top.c+top.a][top.b][0]) { vis[top.c+top.a][top.b][0]=1; q.push(getnode(top.c+top.a,top.b,0,top.pour+top.c)); } } if(top.c && top.b<b)//c->b { if(top.c+top.b>b && !vis[top.a][b][top.c+top.b-b]) { vis[top.a][b][top.c+top.a-a]=1; q.push(getnode(top.a,b,top.c+top.b-b,top.pour+b-top.b)); } if(top.c+top.b<=b && !vis[top.a][top.b+top.c][0]) { vis[top.a][top.b+top.c][0]=1; q.push(getnode(top.a,top.b+top.c,0,top.pour+top.c)); } } if(top.b && top.a<a)//b->a { if(top.b+top.a>a && !vis[a][top.b+top.a-a][top.c]) { vis[a][top.b+top.a-a][top.c]=1; q.push(getnode(a,top.b+top.a-a,top.c,top.pour+a-top.a)); } if(top.b+top.a<=a && !vis[top.a+top.b][0][top.c]) { vis[top.a+top.b][0][top.c]=1; q.push(getnode(top.a+top.b,0,top.c,top.pour+top.b)); } } if(top.a && top.b<b)//a->b { if(top.a+top.b>b && !vis[top.a+top.b-b][b][top.c]) { vis[top.a+top.b-b][b][top.c]=1; q.push(getnode(top.a+top.b-b,b,top.c,top.pour+b-top.b)); } if(top.a+top.b<=b && !vis[0][top.a+top.b][top.c]) { vis[0][top.a+top.b][top.c]=1; q.push(getnode(0,top.a+top.b,top.c,top.pour+top.a)); } } if(top.a && top.c<c)//a->c { if(top.a+top.c>c && !vis[top.a+top.c-c][top.b][c]) { vis[top.a+top.c-c][top.b][c]=1; q.push(getnode(top.a+top.c-c,top.b,top.c,top.pour+c-top.c)); } if(top.a+top.c<=c && !vis[0][top.b][top.a+top.c]) { vis[0][top.b][top.a+top.c]=1; q.push(getnode(0,top.b,top.a+top.c,top.pour+top.a)); } } if(top.b && top.c<c)//b->c { if(top.b+top.c>c && !vis[top.a][top.b+top.c-c][c]) { vis[top.a][top.b+top.c-c][c]=1; q.push(getnode(top.a,top.b+top.c-c,c,top.pour+c-top.c)); } if(top.b+top.c<=c && !vis[top.a][0][top.b+top.c]) { vis[top.a][0][top.b+top.c]=1; q.push(getnode(top.a,0,top.b+top.c,top.pour+top.b)); } } } printf("%d %d\n",pq.top().pour,pq.top().maxd);}int main(){ int t; scanf("%d",&t); while(t--) { scanf("%d%d%d%d",&a,&b,&c,&d); bfs(); } return 0;}
阅读全文
0 0
- uva
- UVA
- UVA
- UVA
- uva
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- Merge Two Sorted Lists
- UITableView实现删除功能 后刷新页面遇到的问题。
- 三、多租户模式转换和租户间隔离级别设置
- 正则表达式之 pattern+?、pattern*?、(?!pattern)、(?:pattern)
- 四、rabbitMQ Work Queues
- UVA
- spring framework 各版本源码下载地址
- Perl之单行命令特技
- poj1251
- Android客户端之“微服私访”App的系统学习(三)基于 OkHttp和Gson 快速获取解析服务数据
- 课程设计————学生信息管理系统二(包含历代思路和代码)
- js 获取map对象的key,value
- js的function为什么不能执行?
- 03_利用cryptopp写hmacsha256算法