九度oj 题目1457:非常可乐
- 题目描述:
-
大家一定觉的运动以后喝可乐是一件很惬意的事情,但是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
这个题一开始也是没什么思路。这些瓶子倒来倒去真实麻烦。后来反应过来应该用深搜或广搜来解决此类问题。深搜的代码写了一半,突然发觉还是用广搜更好些
代码如下#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
#include <algorithm>
using namespace std; int v[][][]; int ans = -;
int s, n, m;
struct State
{
int a, b, c;
State(int a, int b, int c) {
this->a = a, this->b = b, this->c = c;
}
};
queue <State>que; int main(int argc, char const *argv[])
{ while (scanf("%d %d %d", &s, &n, &m) != EOF && (s != && n != && m != )) {
if (s & ) {
puts("NO");
}
else {
int ans = -;
memset(v, -, sizeof(v));
while (!que.empty()) {
que.pop();
}
que.push(State(s, , ));
v[s][][] = ;
while (!que.empty()) {
State p = que.front(); que.pop();
if ((p.a == p.b && p.a == s/) || (p.a == p.c && p.a == s/) || (p.b == p.c && p.b == s/)) {
ans = v[p.a][p.b][p.c];
break;
}
else {
int ra = s - p.a;
int rb = n - p.b;
int rc = m - p.c;
int step = v[p.a][p.b][p.c] + ;
if (ra > ) {
int tmp = min(ra, p.b);
int at = p.a + tmp;
int bt = p.b - tmp;
int ct = p.c;
if (v[at][bt][ct] == - || step < v[at][bt][ct]) {
if (tmp != ) {
que.push(State(at, bt, ct));
v[at][bt][ct] = step;
}
} tmp = min(ra, p.c);
at = p.a + tmp;
bt = p.b;
ct = p.c - tmp;
if (v[at][bt][ct] == - || step < v[at][bt][ct]) {
if (tmp != ) {
que.push(State(at, bt, ct));
v[at][bt][ct] = step;
}
} }
if (rb > ) {
int tmp = min(rb, p.a);
int at = p.a - tmp;
int bt = p.b + tmp;
int ct = p.c;
if (v[at][bt][ct] == - || step < v[at][bt][ct]) {
if (tmp != ) {
que.push(State(at, bt, ct));
v[at][bt][ct] = step;
}
} tmp = min(rb, p.c);
at = p.a;
bt = p.b + tmp;
ct = p.c - tmp;
if (v[at][bt][ct] == - || step < v[at][bt][ct]) {
if (tmp != ) {
que.push(State(at, bt, ct));
v[at][bt][ct] = step;
}
}
}
if (rc > ) {
int tmp = min(rc, p.a);
int at = p.a - tmp;
int bt = p.b ;
int ct = p.c + tmp;
if (v[at][bt][ct] == - || step < v[at][bt][ct]) {
if (tmp != ) {
que.push(State(at, bt, ct));
v[at][bt][ct] = step;
}
} tmp = min(rc, p.b);
at = p.a;
bt = p.b - tmp;
ct = p.c + tmp;
if (v[at][bt][ct] == - || step < v[at][bt][ct]) {
if (tmp != ) {
que.push(State(at, bt, ct));
v[at][bt][ct] = step;
}
}
}//if(rc)
}//else
}//while(queue)
if (ans == -) {
puts("NO");
}
else {
printf("%d\n", ans);
} }//else s is even
}//while(scanf)
return ;
}
九度oj 题目1457:非常可乐的更多相关文章
- 九度OJ 题目1384:二维数组中的查找
/********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...
- hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人
钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- 九度oj题目&吉大考研11年机试题全解
九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码). http://ac.jobdu.com/problem.php?pid=11 ...
- 九度oj 题目1007:奥运排序问题
九度oj 题目1007:奥运排序问题 恢复 题目描述: 按要求,给国家进行排名. 输入: 有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...
- 九度oj 题目1087:约数的个数
题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...
- 九度OJ题目1105:字符串的反码
tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...
- 九度oj题目1009:二叉搜索树
题目描述: 判断两序列是否为同一二叉搜索树序列 输入: 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...
- 九度oj题目1002:Grading
//不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...
- 九度OJ题目1003:A+B
while(cin>>str1>>str2)就行了,多简单,不得不吐槽,九度的OJ真奇葩 题目描述: 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号", ...
随机推荐
- 学习Linux的好网站
http://www.linuxcommand.org/ 很不错的学习shell和script的教程.包含:Learning the shell 和 writing shell scripts 两个内 ...
- 洛谷 P1001 A+B Problem
题目描述 输入两个整数a,b,输出它们的和(|a|,|b|<=10^9). 注意 1.pascal使用integer会爆掉哦! 2.有负数哦! 3.c/c++的main函数必须是int类型,而且 ...
- 日常-acm-开灯问题
开灯问题.有n盏灯,编号1-n.第一个人把所有的灯打开,第二个人按下所有编号为二的倍数的开关(全关掉),第三个人按下所有编号为三的倍数的开关,以此类推.一共k个人,问最后开着的灯的编号.输入n和k,输 ...
- 日常-acm-三位数反转
输入一个三位数,分理出它的百位,十位和个位,反转后输出. 样例输入: 127 样例输出: 721 tips:注意最后一位为0的情况,如360,输出063 #include <iostream&g ...
- 字符串转换JSON 的方法
function (sJSON) { if (window.JSON) { return window.JSON.parse(sJSON); } else { return eval('(' + sJ ...
- Android(java)学习笔记111:Java异常分类
Java异常可分为3种: (1)编译时异常:Java.lang.Exception (2)运行期异常:Java.lang.RuntimeException (3)错误:Java.lang.Error
- 【转】 iOS学习之NSBundle介绍和使用
bundle是一个目录,其中包含了程序会使用到的资源.这些资源包含了如图像,声音,编译好的代码,nib文件(用户也会把bundle称为plug-in).对应bundle, cocoa提供了类NSBun ...
- kubernetes-平台日志收集(ELK)
使用ELK Stack收集Kubernetes平台中日志与可视化 K8S系统的组件日志 K8S Cluster里面部署的应用程序日志 日志系统: ELK安装 安装jdk [root@localhost ...
- MySQL查询显示连续的结果
#mysql中 对于查询结果只显示n条连续行的问题# 在领扣上碰到的一个题目:求满足条件的连续3行结果的显示 X city built a new stadium, each day many peo ...
- linux关于进程、内存和cpu情况
1.load average: 2.03, 1.76, 1.80 1分钟.5分钟.15分钟平均负载 2.%Cpu(s):100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa ...