【ACM- OJ】《非常可乐》C++
【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++相关推荐
- c语言字符统计2sdut,山东理工大学SDUT - ACM OJ 题: Python代码 及分析
Python基础语法学习完成,先刷基础题100道巩固 ,附 题目.代码.知识分析 题目:http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Index ...
- 几个有名的 ACM oj
几个有名的在线做题系统(ACM OJ) 1. 浙江大学 Online Judge(ZOJ) http://acm.zju.edu.cn 国内最早也是最有名气的OJ,有很多高手在上面做题.特点 ...
- ACM OJ 平台以及平台题目分类
OJ是Online Judge系统的简称,用来在线检测程序源代码的正确性.著名的OJ有RQNOJ.URAL等.国内著名的题库有北京大学题库.浙江大学题库等.国外的题库包括乌拉尔大学.瓦拉杜利德大学题库 ...
- 几个有名的在线做题系统(ACM OJ)
1. 浙江大学 Online Judge(ZOJ) http://acm.zju.edu.cn 国内最早也是最有名气的OJ,有很多高手在上面做题.特点是数据比较刁钻,经常会有你想不到的边界数 ...
- ACM OJ反馈结果大全
下面是常见的OJ评判结果以及它们表示的意思: Waiting:你的程序刚刚提交,正在等待OJ评测你的程序. Compiling:OJ正在编译你的程序. Accepted:OK!你的程序是正确的 ^_^ ...
- 1065 浙江中医药大学ACM OJ
哈哈哈哈哈,时隔多年,又AC了一道题小小的嘚瑟下,让自己有动力去AC下一道题, 今天就要蓝桥杯选拔赛了呢,小小的激动了一把,虽然我还比较渣,但谁也不能阻止我成长 进入正题: 绝对AC过了的代码: #i ...
- 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 ...
- 烟台大学ACM OJ之手机后四位尾号问题
Description 30年的改革开放,给中国带来了翻天覆地的变化.2011全年中国手机产量约为11.72亿部.手机已经成为百姓的基本日用品!给手机选个好听又好记的号码可能是许多人的心愿.但号源有限 ...
- 各大高校oj判题系统
ACM OJ Collection(排名不分先后): 中国:(China) 华东地区: 浙江: 杭州电子科技大学(HDU):http://acm.hdu.edu.cn/ 浙江大学(ZJU):http: ...
- ACM算法分类和资源
知名在线做题网站: ACM OJ Collection(排名不分先后): 中国: 浙江大学(ZJU):http://acm.zju.edu.cn/ 北京大学(PKU):http://acm.pku.e ...
最新文章
- java动态代理【一】
- CodeMapping:稀疏SLAM实时密集建图(帝国理工学院)
- (深入理解)model.eval() 、model.train()以及torch.no_grad() 的区别
- 项目整体管理:指导和管理项目工作
- 博客创办目的——————欢迎相互学习
- Using .NET C# LDAP Library(Novell.Directory.Ldap)
- django权限二(多级菜单的设计以及展示)
- HDU多校联合赛(1007 Magical Forest)模拟题
- 采用keepalived施工可用性MySQL-HA
- SID与域信任不一致导致AD无法登陆/server2003系统封装
- javaweb java代码写在哪里_写了那么多年 Java 代码,终于 debug 到 JVM 了
- Android studio: 自 maven 增加一個函式庫
- 访问WebServcie遇到配额不足的时候,请增加配额
- 【数模】整数规划模型
- 【数据结构】开端序幕
- RGB、HSV和Lab颜色空间
- 常见即时通讯:网易IM 、腾讯IM、环信IM、融云IM、leancloud IM介绍
- MySQL鲜为人知的排序方式
- NOI题库 8211 派
- 爬虫爬虫 day2 爬取校网文章