HDU-1459.非常可乐(BFS )
这道题TLE了很多次,原来一直以为将数字化为最简可以让运算更快,但是去了简化之后才发现,真正耗时的就是化简....还和队友学到了用状态少直接数组模拟刚就能过...
本题大意:给出可乐的体积v1,给出两个杯子v2和v3,要求v2 + v3 == v1,每次只能从一个杯子倒到另一个杯子,问最少倒多少次可以将可乐平分。
思路:最后可乐肯定在可乐瓶和大杯子里面,直接BFS暴搜就行了。
参考代码:
1 #include <cstdio> 2 #include <queue> 3 #include <cstring> 4 using namespace std; 5 6 struct node { 7 int cur[3], step; 8 } now, Next; 9 10 const int maxn = 100 + 5; 11 int v[3]; 12 int ans, t; 13 bool flag; 14 bool vis[maxn][maxn][maxn]; 15 16 void bfs() { 17 if(v[0] & 1) { 18 flag = false; 19 return; 20 } 21 queue <node> Q; 22 now.cur[0] = v[0], now.cur[1] = 0, now.cur[2] = 0, now.step = 0; 23 vis[v[0]][0][0] = true; 24 Q.push(now); 25 while(!Q.empty()) { 26 now = Q.front(); 27 Q.pop(); 28 if(now.cur[0] == now.cur[1] && now.cur[2] == 0) { 29 ans = now.step; 30 return; 31 } 32 for(int i = 0; i < 3; i ++) {//i -> j 33 for(int j = 0; j < 3; j ++) { 34 if(i != j) { 35 Next = now; 36 t = now.cur[i] + now.cur[j]; 37 if(t > v[j]) Next.cur[j] = v[j]; 38 else Next.cur[j] = t; 39 Next.cur[i] = t - Next.cur[j]; 40 if(!vis[Next.cur[0]][Next.cur[1]][Next.cur[2]]) { 41 Next.step = now.step + 1; 42 Q.push(Next); 43 vis[Next.cur[0]][Next.cur[1]][Next.cur[2]] = true; 44 } 45 } 46 } 47 } 48 } 49 flag = false; 50 } 51 52 int main () { 53 while(~scanf("%d %d %d", &v[0], &v[1], &v[2])) { 54 memset(vis, false, sizeof(vis)); 55 if(v[0] == 0 && v[1] == 0 && now.cur[2] == 0) break; 56 flag = true, ans = 0; 57 if(v[1] < v[2]) { 58 t = v[1]; 59 v[1] = v[2]; 60 v[2] = t; 61 } 62 bfs(); 63 if(flag) printf("%d\n", ans); 64 else printf("NO\n"); 65 } 66 return 0; 67 }
View Code
下面这个代码的效率要高一点,区别在于倒水方式不同。
1 #include <cstdio> 2 #include <queue> 3 #include <cstring> 4 using namespace std; 5 6 struct node { 7 int cur[3], step; 8 } now, Next; 9 10 const int maxn = 100 + 5; 11 int v[3]; 12 int ans, t; 13 bool flag; 14 bool vis[maxn][maxn][maxn]; 15 16 void bfs() { 17 if(v[0] & 1) { 18 flag = false; 19 return; 20 } 21 queue <node> Q; 22 now.cur[0] = v[0], now.cur[1] = 0, now.cur[2] = 0, now.step = 0; 23 vis[v[0]][0][0] = true; 24 Q.push(now); 25 while(!Q.empty()) { 26 now = Q.front(); 27 Q.pop(); 28 if(now.cur[0] == now.cur[1] && now.cur[2] == 0) { 29 ans = now.step; 30 return; 31 } 32 for(int i = 0; i < 3; i ++) {//i -> j 33 for(int j = 0; j < 3; j ++) { 34 if(i != j) { 35 Next = now; 36 if(j == 0) { 37 Next.cur[j] = now.cur[j] + now.cur[i]; 38 Next.cur[i] = 0; 39 } else if(j == 1) { 40 t = v[1] - now.cur[j]; 41 Next.cur[i] = now.cur[i] - t; 42 Next.cur[i] = Next.cur[i] > 0 ? Next.cur[i] : 0; 43 Next.cur[j] = now.cur[j] + now.cur[i]; 44 Next.cur[j] = Next.cur[j] < v[1] ? Next.cur[j] : v[1]; 45 } else { 46 t = v[2] - now.cur[j]; 47 Next.cur[i] = now.cur[i] - t; 48 Next.cur[i] = Next.cur[i] > 0 ? Next.cur[i] : 0; 49 Next.cur[j] = now.cur[j] + now.cur[i]; 50 Next.cur[j] = Next.cur[j] < v[2] ? Next.cur[j] : v[2]; 51 } 52 if(!vis[Next.cur[0]][Next.cur[1]][Next.cur[2]]) { 53 Next.step = now.step + 1; 54 Q.push(Next); 55 vis[Next.cur[0]][Next.cur[1]][Next.cur[2]] = true; 56 } 57 } 58 } 59 } 60 } 61 flag = false; 62 } 63 64 int main () { 65 while(~scanf("%d %d %d", &v[0], &v[1], &v[2])) { 66 memset(vis, false, sizeof(vis)); 67 if(v[0] == 0 && v[1] == 0 && now.cur[2] == 0) break; 68 flag = true, ans = 0; 69 if(v[1] < v[2]) { 70 t = v[1]; 71 v[1] = v[2]; 72 v[2] = t; 73 } 74 bfs(); 75 if(flag) printf("%d\n", ans); 76 else printf("NO\n"); 77 } 78 return 0; 79 }
View Code
转载于:https://www.cnblogs.com/bianjunting/p/10493581.html
HDU-1459.非常可乐(BFS )相关推荐
- hdu 1495 非常可乐 (bfs)
非常可乐 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- HDU 1495 非常可乐(BFS||数论)
非常可乐 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- hdu 1495非常可乐 BFS
文章目录 AC代码 TLE ???为啥啊?不知道哪里不对,导致超时 对比发现,超时和输出使用cin等 无关,貌似是pour函数采用传参的方法就会超时,需要使用全局变量才不会超时 = = ... AC代 ...
- HDU - 1495 非常可乐(BFS,数学)
HDU - 1495 非常可乐(BFS,数学) 巨佬的数学解法 #include<iostream> using namespace std; int gcd(int a,int b) { ...
- HDU 1495 非常可乐
- HDU 1495 - 非常可乐 Problem Description 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和 ...
- HDU 1495 非常可乐(数论,BFS)
非常可乐 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- Hdu 1495 非常可乐、BFS、模拟:【题解】
非常可乐 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Descri ...
- hdu 1495 非常可乐(BFS)
题目链接:hdu1495 共有6种操作,x-->y,x-->z,y-->x,y-->z,z-->x,z-->y #include<stdio.h> #i ...
- HDU 1495 非常可乐
非常可乐 http://acm.hdu.edu.cn/showproblem.php?pid=1495 Time Limit: 2000/1000 MS (Java/Others) Memory ...
- hdu - 1072 Nightmare(bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1072 遇到Bomb-Reset-Equipment的时候除了时间恢复之外,必须把这个点做标记不能再走,不然可能造 ...
最新文章
- Libgdx New 3D API 教程之 -- 使用Libgdx加载模型
- jquery 过滤html代码,jquery – 如何使指令使用过滤的HTML属性?
- 模板:容斥优化多重方案背包
- 报错 插入更新_window如何解决mysql数据量过大导致的报错
- jenkins集成钉消息通知
- 带宽与码元的关系_再遇到码元、速率、、带宽【9】
- 大数据之-入门_Hadoop发展历史---大数据之hadoop工作笔记0009
- Mac下快速新建txt文件
- SqlServer中 Partition By 的使用
- 怎么用eclipse修改web工程的访问路径
- clickinrefresh.php,IDCZE_v3.0 IDCZE商业导航系统全新仿照114la网址导航 - 下载 - 搜珍网...
- 代码管理学:如何给新员工安排工作
- Golang8小时基础入门
- 时间序列预测的机器学习方法
- web前端设计与开发期末作品:旅游网站设计——响应式的出国旅游定制(17页) HTML+CSS+JavaScript 旅游网页html 旅游景点html...
- Python练手项目:计算机自动还原魔方(3)还原两层
- ue4 中动画控制,利用conduit节点
- 多电脑切换器(KVM切换器)工作原理
- 电商平台订单号生成策略
- 计算机应用基础 教材 黄洪艺,高教社产品信息检索系统