题目描述:

大家一定觉的运动以后喝可乐是一件很惬意的事情,但是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:非常可乐的更多相关文章

  1. 九度OJ 题目1384:二维数组中的查找

    /********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...

  2. hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  3. 九度oj题目&amp;吉大考研11年机试题全解

    九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码).    http://ac.jobdu.com/problem.php?pid=11 ...

  4. 九度oj 题目1007:奥运排序问题

    九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...

  5. 九度oj 题目1087:约数的个数

    题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  6. 九度OJ题目1105:字符串的反码

    tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...

  7. 九度oj题目1009:二叉搜索树

    题目描述: 判断两序列是否为同一二叉搜索树序列 输入:                        开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接 ...

  8. 九度oj题目1002:Grading

    //不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...

  9. 九度OJ题目1003:A+B

    while(cin>>str1>>str2)就行了,多简单,不得不吐槽,九度的OJ真奇葩 题目描述: 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号", ...

随机推荐

  1. C# 简单创建和删除文件夹

    文章转自http://www.cnblogs.com/pegasus923/archive/2011/01/26/1944838.html C#中对文件夹操作需要用到Directory Class.其 ...

  2. dataset datatable datacolums datarow

    DataSet 表示数据在内存中的缓存. 属性 Tables  获取包含在 DataSet 中的表的集合. ds.Tables["sjxx"] DataTable 表示内存中数据的 ...

  3. 突然心血来潮,想写写我在java面试中遇到的事。作为一个应届生,我觉得我的情况都与大部分应届生是差不多的,希望你们能在这上面得到一些有用的

    面试过程吧,怎么说呢?从一开始接触面试到现在成功了几家,这中间我确实收获了许多,那我就从我第一次面试开始讲吧. 第一次面试是有人介绍过来的,总之还是有一位贵人相助,所以第一次面试时,面试官很好没有怎么 ...

  4. 【转载】Cesium基础使用介绍

    既然给我发了参与方式,不参加似乎有点不给人面子,反正也没多少人看我的博客,那我就试试吧,也欢迎大家自己参与:2017年度全网原创IT博主评选活动投票:http://www.itbang.me/goVo ...

  5. 3. Netbackup 7.6客户端的安装(windows/linux)

    1 客户端的安装 1.1 Windows客户端安装 1.1.1 客户端hosts修改 windows xp/2003/vista/2008/7/8用户HOSTS文件是在“c:\windows\syst ...

  6. cocos2dx for android 接入 fmod的过程

    cocos2dx自带的音效播放有SimpleAudioEngine和AudioEngine两个,SimpleAudioEngine可以播放简单的音效, 如果播放音效数量过多的话,多导致有些音效播放失败 ...

  7. Mutations-freecodecamp算法题目

    Mutations(比较字符串) 要求 如果数组第一个字符串元素包含了第二个字符串元素的所有字符,函数返回true. 不用考虑大小写和字符顺序 思路 将数组中的两个字符串小写化 将第二个数组元素(第二 ...

  8. centos 安装 python3 分类链接

    上一篇文章描述了如何安装python3,但是在后续安装pip便不断报出缺少各类模块,安装一个又需要依赖另一个,导致安装过程非常繁琐.究其原因,我是安装centos-minimal版本,有许多功能不是完 ...

  9. Linux常用快捷键以及如何查看命令帮助

    1.1    Linux系统快速操作常用快捷键 快捷键名称 快捷作用 Ctrl + a 将光标移至行首 Ctrl + e 将光标移至行尾 Ctrl + u 前提光标在行尾,则清除当前行所有的内容(有空 ...

  10. MySQL中 IFNULL、NULLIF和ISNULL函数的用法

    mysql 中 ifnull().nullif().isnull()函数的用法讲解: 一.IFNULL(expr1,expr2)用法: 假如expr1不为NULL,则 IFNULL() 的返回值为ex ...