【ACM- OJ】《非常可乐》C++

  • 题目描述
  • 输入
  • 输出
  • 样例输入
  • 样例输出
  • AC代码

题目描述

大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。聪明的ACMER你们说他们能平分吗?如果能请输出倒可乐的最少的次数,如果不能输出"NO"。

输入

三个整数 : S 可乐的体积 , N 和 M是两个杯子的容量,以"0 0 0"结束。

输出

如果能平分的话请输出最少要倒的次数,否则输出"NO"。

样例输入

7 4 3
4 1 3
0 0 0

样例输出

NO
3

AC代码

//
//  main.cpp
//  非常可乐
//
//  Created by HISS on 2020/10/24.
//  Copyright © 2020 HISS. All rights reserved.
//#include "iostream"
#include <string.h>
#include <stdio.h>
#include <queue>
using namespace std;int s,n,m;
int vis[105][105][105];struct node
{int s, n, m, step;  //三个杯子的可乐和步数
};int check(int x,int y,int z)    //平分条件
{if(x == 0 && y == z)return 1;if(y == 0 && x == z)return 1;if(z == 0 && x == y)return 1;return 0;
}int bfs()
{//三个杯的情况queue<node> Q;//next是下一次三个杯的情况node a, next;a.s = s;a.n = 0;a.m = 0;a.step = 0;//是否出现过这种情况vis[s][0][0] = 1;Q.push(a);while(!Q.empty()){//目前杯的情况a = Q.front();Q.pop();//如果成功返回步数if(check(a.s, a.n, a.m))return a.step;if(a.n) //当n杯中还有{if(a.n > s - a.s)   //将n杯倒入s杯中能将s杯倒满{//下一次三个杯的情况next = a;next.n = next.n - (s - a.s);next.s = s;//没倒成这种情况(如果之前出现过这种情况就没意义了)if(!vis[next.s][next.n][next.m]){next.step = a.step + 1;Q.push(next);vis[next.s][next.n][next.m] = 1;}}else    //将n杯倒入s杯中不能将s杯倒满{next = a;next.s = next.n + next.s;next.n = 0;if(!vis[next.s][next.n][next.m]){next.step = a.step+1;Q.push(next);vis[next.s][next.n][next.m] = 1;}}if(a.n > m - a.m)//将n杯倒入m杯中能将m杯倒满{next = a;next.n = next.n - (m - a.m);next.m =  m;if(!vis[next.s][next.n][next.m]){next.step = a.step+1;Q.push(next);vis[next.s][next.n][next.m] = 1;}}else//将n杯倒入m杯中不能将m杯倒满{next = a;next.m = next.n+next.m;next.n = 0;if(!vis[next.s][next.n][next.m]){next.step = a.step+1;Q.push(next);vis[next.s][next.n][next.m] = 1;}}}if(a.m) //同上{if(a.m>s-a.s){next = a;next.m = next.m-(s-a.s);next.s = s;if(!vis[next.s][next.n][next.m]){next.step = a.step+1;Q.push(next);vis[next.s][next.n][next.m] = 1;}}else{next = a;next.s = next.m+next.s;next.m = 0;if(!vis[next.s][next.n][next.m]){next.step = a.step+1;Q.push(next);vis[next.s][next.n][next.m] = 1;}}if(a.m>n-a.n){next = a;next.m = next.m-(n-a.n);next.n =  n;if(!vis[next.s][next.n][next.m]){next.step = a.step+1;Q.push(next);vis[next.s][next.n][next.m] = 1;}}else{next = a;next.n = next.m+next.n;next.m = 0;if(!vis[next.s][next.n][next.m]){next.step = a.step+1;Q.push(next);vis[next.s][next.n][next.m] = 1;}}}if(a.s) //同上{if(a.s > n - a.n){next = a;next.s = next.s-(n-a.n);next.n = n;if(!vis[next.s][next.n][next.m]){next.step = a.step+1;Q.push(next);vis[next.s][next.n][next.m] = 1;}}else{next = a;next.n = next.s+next.n;next.s = 0;if(!vis[next.s][next.n][next.m]){next.step = a.step+1;Q.push(next);vis[next.s][next.n][next.m] = 1;}}if(a.s>m-a.m){next = a;next.s = next.s-(m-a.m);next.m =  m;if(!vis[next.s][next.n][next.m]){next.step = a.step+1;Q.push(next);vis[next.s][next.n][next.m] = 1;}}else{next = a;next.m = next.m+next.s;next.s = 0;if(!vis[next.s][next.n][next.m]){next.step = a.step+1;Q.push(next);vis[next.s][next.n][next.m] = 1;}}}}return 0;
}int main()
{int ans;while(cin >> s >> n >> m){if(s == 0)break;if(s % 2)   //奇数肯定不能平分,因为杯子是整数体积大小{cout << "NO" << endl;continue;}memset(vis, 0, sizeof(vis));ans = bfs();if(ans)cout << ans << endl;elsecout << "NO" << endl;}return 0;
}

【ACM- OJ】《非常可乐》C++相关推荐

  1. c语言字符统计2sdut,山东理工大学SDUT - ACM OJ 题: Python代码 及分析

    Python基础语法学习完成,先刷基础题100道巩固 ,附 题目.代码.知识分析 题目:http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index ...

  2. 几个有名的 ACM oj

    几个有名的在线做题系统(ACM OJ) 1. 浙江大学 Online Judge(ZOJ) http://acm.zju.edu.cn      国内最早也是最有名气的OJ,有很多高手在上面做题.特点 ...

  3. ACM OJ 平台以及平台题目分类

    OJ是Online Judge系统的简称,用来在线检测程序源代码的正确性.著名的OJ有RQNOJ.URAL等.国内著名的题库有北京大学题库.浙江大学题库等.国外的题库包括乌拉尔大学.瓦拉杜利德大学题库 ...

  4. 几个有名的在线做题系统(ACM OJ)

    1. 浙江大学 Online Judge(ZOJ) http://acm.zju.edu.cn      国内最早也是最有名气的OJ,有很多高手在上面做题.特点是数据比较刁钻,经常会有你想不到的边界数 ...

  5. ACM OJ反馈结果大全

    下面是常见的OJ评判结果以及它们表示的意思: Waiting:你的程序刚刚提交,正在等待OJ评测你的程序. Compiling:OJ正在编译你的程序. Accepted:OK!你的程序是正确的 ^_^ ...

  6. 1065 浙江中医药大学ACM OJ

    哈哈哈哈哈,时隔多年,又AC了一道题小小的嘚瑟下,让自己有动力去AC下一道题, 今天就要蓝桥杯选拔赛了呢,小小的激动了一把,虽然我还比较渣,但谁也不能阻止我成长 进入正题: 绝对AC过了的代码: #i ...

  7. AK acm/oj.Print a Chessboard

    题目描述 Print a Chessboard Draw a chessboard which has a height of H cm and a width of W cm. For exampl ...

  8. 烟台大学ACM OJ之手机后四位尾号问题

    Description 30年的改革开放,给中国带来了翻天覆地的变化.2011全年中国手机产量约为11.72亿部.手机已经成为百姓的基本日用品!给手机选个好听又好记的号码可能是许多人的心愿.但号源有限 ...

  9. 各大高校oj判题系统

    ACM OJ Collection(排名不分先后): 中国:(China) 华东地区: 浙江: 杭州电子科技大学(HDU):http://acm.hdu.edu.cn/ 浙江大学(ZJU):http: ...

  10. ACM算法分类和资源

    知名在线做题网站: ACM OJ Collection(排名不分先后): 中国: 浙江大学(ZJU):http://acm.zju.edu.cn/ 北京大学(PKU):http://acm.pku.e ...

最新文章

  1. java动态代理【一】
  2. CodeMapping:稀疏SLAM实时密集建图(帝国理工学院)
  3. (深入理解)model.eval() 、model.train()以及torch.no_grad() 的区别
  4. 项目整体管理:指导和管理项目工作
  5. 博客创办目的——————欢迎相互学习
  6. Using .NET C# LDAP Library(Novell.Directory.Ldap)
  7. django权限二(多级菜单的设计以及展示)
  8. HDU多校联合赛(1007 Magical Forest)模拟题
  9. 采用keepalived施工可用性MySQL-HA
  10. SID与域信任不一致导致AD无法登陆/server2003系统封装
  11. javaweb java代码写在哪里_写了那么多年 Java 代码,终于 debug 到 JVM 了
  12. Android studio: 自 maven 增加一個函式庫
  13. 访问WebServcie遇到配额不足的时候,请增加配额
  14. 【数模】整数规划模型
  15. 【数据结构】开端序幕
  16. RGB、HSV和Lab颜色空间
  17. 常见即时通讯:网易IM 、腾讯IM、环信IM、融云IM、leancloud IM介绍
  18. MySQL鲜为人知的排序方式
  19. NOI题库 8211 派
  20. 爬虫爬虫 day2 爬取校网文章

热门文章

  1. horovodrun命令参数解析
  2. 华为天才少年造出自动驾驶单车!图纸已开源,硬件成本一万,B站老板:重新定义「自行」车
  3. 台式计算机网络共享,台式WIN7双网卡共享另外一部台式电脑上网设置
  4. Flowable 79 张表都是干嘛的?
  5. redis实现阻塞轮训队列
  6. 为了性能,别再用pip安装TensorFlow了
  7. 用Python写了个检测文章抄袭,详谈去重算法原理
  8. get、put、post、delete含义与区别
  9. 这笔钱领了吗?拥有信息系统项目管理师等软考类证书可获技能提升补贴最高2000元!
  10. win10如何打开文件扩展名(俗称后缀名)?简单易懂!