非常可乐

yizhihongxing

题目描述

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

输入

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

输出

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

样例输入

7 4 3
4 1 3
0 0 0

样例输出

NO
3

代码

(不得不说好难啊)

#include <bits/stdc++.h>
using namespace std;
int vis[105][105][105];
int v[3];//可乐瓶和两个杯子的容量
int s,n,m,flag;
struct node{
	int coke[3];//可乐瓶和两个杯子当前的量
	int s;//倒的次数
};
void bfs()
{
	int avg=v[0]/2;
	memset(vis,0,sizeof(vis));
	flag=0;
	queue<node> q;
	node temp;
	
	temp.coke[0]=v[0];
	temp.coke[1]=0;
	temp.coke[2]=0;
	temp.s=0;
	
	vis[v[0]][0][0]=1;
	q.push(temp);
	while(!q.empty())
	{
		temp=q.front();
		q.pop();
		if((temp.coke[0]==avg&&temp.coke[1]==avg)||(temp.coke[0]==avg&&temp.coke[2]==avg)||(temp.coke[1]==avg&&temp.coke[2]==avg))
		{
			cout << temp.s << endl;
			flag=1;
			break;
		}
		//i杯子中的可乐往j中倒
		for(int i=0;i<3;i++)
		{//6种方案:0➡1  0➡2 1➡0 1➡2 2➡0 2➡1
			for(int j=0;j<3;j++)
			{
				if(i==j) continue;//自己不能给自己倒
				node tmp=temp;
				
				int pour=min(tmp.coke[i],v[j]-tmp.coke[j]);//取杯子i中的剩余可乐和杯子j中的剩余容量最小值
				tmp.coke[j]+=pour;
				tmp.coke[i]-=pour;
				
				if(!vis[tmp.coke[0]][tmp.coke[1]][tmp.coke[2]])
				{
					vis[tmp.coke[0]][tmp.coke[1]][tmp.coke[2]]=1;
					tmp.s++;
					q.push(tmp);
				}
			}
		}
	}
	if(!flag) cout << "NO\n";
}
int main()
{
	while(cin >> v[0] >> v[1] >> v[2]&&(v[0]||v[1]||v[2]))
	{
		if(v[0]%2==1)
		{
			cout << "NO\n";
			continue;
		}
		bfs();
	}
	return 0;
}

原文链接:https://www.cnblogs.com/momotrace/p/very-cola.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:非常可乐 - Python技术站

(0)
上一篇 2023年4月27日
下一篇 2023年4月27日

相关文章

  • STL容器之queue

    是什么 循环队列, FIFO先进先出 怎么用 初始化 //C11 deque<int> deq{1,2,3,4,5}; //拷贝构造,可以拷贝deque queue<int> que(deq); //100个5 queue<int> que2(100,5); //运算符重载 que2 = que; 操作 //队尾添加元素 …

    C++ 2023年4月17日
    00
  • C++ 测试框架 GoogleTest 初学者入门篇 乙

    *以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/aFeiOGO-N9O7Ab_8KJ2wxw 开发者虽然主要负责工程里的开发任务,但是每个开发完毕的功能都是需要开发者自测通过的,所以经常会听到开发者提起单元测试的话题。那么今天我就带大伙一起来看看大名鼎鼎的谷歌 C++ 测试…

    C++ 2023年4月18日
    00
  • 【Visual Leak Detector】配置项 TraceInternalFrames

    说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。本篇介绍 VLD 配置文件中配置项 TraceInternalFrames 的使用方法。同系列文章目录可见 《内存泄漏检测工具》目录 目录 说明 1. 配置文件使用说明 2. 设置是否跟踪内部堆栈的调用 2.1 测试代码 2.2 TraceInternalFrames = no 时的输出 2.3 …

    C++ 2023年4月18日
    00
  • C++动态分配(new)二维数组的若干方法

    写在前面 之前刷动态规划的题目,多需要用到二维数组(也许后面再优化成一维)。如果每次都按照给定数的范围直接声明为全局二维数组变量,又总觉得的不够优雅。查阅了一些网上的资料后,总结了一些使用方法,就写下这篇博文用以记录。 方法1——动态分配(new)一维数组,再强制类型转换为二维(个人使用,推荐指数:⭐⭐⭐⭐) 直接看例子 /** 假设需要根据两个string…

    C++ 2023年4月17日
    00
  • 【Visual Leak Detector】使用注意事项

    说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。本篇介绍使用 VLD 时的注意事项。同系列文章目录可见 《内存泄漏检测工具》目录 目录 说明 1. 官网文档 2. 注意事项 1. 官网文档 可以在 Using-Visual-Leak-Detector 官方文档里看到如何使用 VLD,里面介绍了如何在 Visual C++ 2003/2005/2…

    C++ 2023年4月17日
    00
  • 创建一个简单的Qt工程

    1.打开QtCreator进行如下选择。(开软去官网下载即可,注册邮箱可以断网跳过) 第一步: 选择Application     第二步:这里文件名称和路径都不要有中文 第三步:选择编译模式 点击下一步 第四步:选择 Widget点击下一步   第五步:运行工程,判断是否创建成功 课堂小记: 1.析构函数不能被重载 2.被protect关键字修饰的成员变量…

    C++ 2023年5月7日
    00
  • Qt源码阅读(四) 事件循环

    事件系统 文章为本人理解,如有理解不到位之处,烦请各位指正。 @ 目录 事件系统 什么是事件循环? 事件是如何产生的? sendEvent postEvent 事件是如何处理的? 事件循环是怎么遍历的? 事件过滤器 event 夹带私货时间 Qt的事件循环,应该是所有Qter都避不开的一个点,所以,这篇博客,咱们来了解源码中一些关于Qt中事件循环的部分。先抛…

    C++ 2023年4月18日
    00
  • 前缀和

    前缀和 一、介绍 前缀,顾名思义就是一个东西前面的点缀…(bushi 其实打比方来说就是:假如有一字符串ABCD,那么他的前缀就是A、AB、ABC、ABCD这四个从新从第一个字母一次往后开始拼接的字符串。当然这是字符串。但前缀和一般应用于数组,对于给定的数组a=[1,2,3,4],他的前 i 项和sum[i]就表示数组中a[0]~a[i]的和,具体为:s…

    C++ 2023年5月3日
    00
合作推广
合作推广
分享本页
返回顶部