这道题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 )相关推荐

  1. hdu 1495 非常可乐 (bfs)

    非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  2. HDU 1495 非常可乐(BFS||数论)

    非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  3. hdu 1495非常可乐 BFS

    文章目录 AC代码 TLE ???为啥啊?不知道哪里不对,导致超时 对比发现,超时和输出使用cin等 无关,貌似是pour函数采用传参的方法就会超时,需要使用全局变量才不会超时 = = ... AC代 ...

  4. HDU - 1495 非常可乐(BFS,数学)

    HDU - 1495 非常可乐(BFS,数学) 巨佬的数学解法 #include<iostream> using namespace std; int gcd(int a,int b) { ...

  5. HDU 1495 非常可乐

    - HDU 1495 - 非常可乐 Problem Description 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和 ...

  6. HDU 1495 非常可乐(数论,BFS)

    非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  7. Hdu 1495 非常可乐、BFS、模拟:【题解】

    非常可乐 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Problem Descri ...

  8. hdu 1495 非常可乐(BFS)

    题目链接:hdu1495 共有6种操作,x-->y,x-->z,y-->x,y-->z,z-->x,z-->y #include<stdio.h> #i ...

  9. HDU 1495 非常可乐

    非常可乐 http://acm.hdu.edu.cn/showproblem.php?pid=1495 Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  10. hdu - 1072 Nightmare(bfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=1072 遇到Bomb-Reset-Equipment的时候除了时间恢复之外,必须把这个点做标记不能再走,不然可能造 ...

最新文章

  1. Libgdx New 3D API 教程之 -- 使用Libgdx加载模型
  2. jquery 过滤html代码,jquery – 如何使指令使用过滤的HTML属性?
  3. 模板:容斥优化多重方案背包
  4. 报错 插入更新_window如何解决mysql数据量过大导致的报错
  5. jenkins集成钉消息通知
  6. 带宽与码元的关系_再遇到码元、速率、、带宽【9】
  7. 大数据之-入门_Hadoop发展历史---大数据之hadoop工作笔记0009
  8. Mac下快速新建txt文件
  9. SqlServer中 Partition By 的使用
  10. 怎么用eclipse修改web工程的访问路径
  11. clickinrefresh.php,IDCZE_v3.0 IDCZE商业导航系统全新仿照114la网址导航 - 下载 - 搜珍网...
  12. 代码管理学:如何给新员工安排工作
  13. Golang8小时基础入门
  14. 时间序列预测的机器学习方法
  15. web前端设计与开发期末作品:旅游网站设计——响应式的出国旅游定制(17页) HTML+CSS+JavaScript 旅游网页html 旅游景点html...
  16. Python练手项目:计算机自动还原魔方(3)还原两层
  17. ue4 中动画控制,利用conduit节点
  18. 多电脑切换器(KVM切换器)工作原理
  19. 电商平台订单号生成策略
  20. 计算机应用基础 教材 黄洪艺,高教社产品信息检索系统

热门文章

  1. Mysql创建数据库用户
  2. python系统问题
  3. pytorch 与 numpy 的数组广播机制
  4. LeetCode简单题之爬楼梯
  5. LeetCode简单题之寻找比目标字母大的最小字母
  6. LeetCode简单题之两个列表的最小索引总和
  7. 视频教学动作修饰语:CVPR2020论文解析
  8. mysql sql w3cschool_SQL复习(w3school)笔记
  9. Openfire XMPP Smack RTC IM 即时通讯 聊天 MD
  10. 理解数据类型与数学运算:求和、温度转换