九度OJ-1457:非常可乐

2024-08-23 02:48
文章标签 九度 oj 1457 可乐 非常

本文主要是介绍九度OJ-1457:非常可乐,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  本题也是转化为状态建立解答树并剪枝,然后进行广度优先搜索。

Debug记录:

①找了很久,最后发现是mark数组的初始化除了问题,原代码如下:

		for (int i=1;i<=S;i++){for (int j=1;j<=N;j++){for (int k=1;k<=M;k++){mark[i][j][k]=false;}}}
下标明明要从0开始遍历的,空杯子也是一种状态。所以以后初始化标记数组的时候记得无论如何从0开始,即使[0]不会被用到。

题目描述:

大家一定觉的运动以后喝可乐是一件很惬意的事情,但是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 <iostream>
#include <queue>
#define MAXSIZE 100
using namespace std;
struct Ans{int s,n,m,t;Ans(){}Ans(int s,int n,int m,int t){this->s=s;this->n=n;this->m=m;this->t=t;}
};
bool mark[MAXSIZE+1][MAXSIZE+1][MAXSIZE+1];
queue<Ans> q;
void A2B(int A,int B,int &a,int &b,Ans &ans){if (a+b>B){//Òç³öa-=B-b;b=B;}else{b+=a;a=0;}ans.t++;if (mark[ans.s][ans.n][ans.m]==false){mark[ans.s][ans.n][ans.m]=true;q.push(ans);}
}int main(){int S,N,M;Ans tempAns;bool find;while (cin>>S>>N>>M,S&&N&&M){//odd impossible if (S%2==1){cout<<"NO"<<endl;continue;}//initiatewhile (!q.empty())q.pop();for (int i=0;i<=S;i++){for (int j=0;j<=N;j++){for (int k=0;k<=M;k++){mark[i][j][k]=false;}}}q.push(Ans(S,0,0,0));mark[S][0][0]=true;find=false;//shift while (!q.empty()){//judgeif ((q.front().s==0&&q.front().n==q.front().m)||(q.front().n==0&&q.front().s==q.front().m)||(q.front().m==0&&q.front().s==q.front().n)){//find or not cout<<q.front().t<<endl;find=true;break;}//shiftif (q.front().s!=0){//S shift //S->NtempAns=q.front();A2B(S,N,tempAns.s,tempAns.n,tempAns);//S->MtempAns=q.front();A2B(S,M,tempAns.s,tempAns.m,tempAns);}if (q.front().n!=0){//N shift//N->StempAns=q.front();A2B(N,S,tempAns.n,tempAns.s,tempAns);//N->MtempAns=q.front();A2B(N,M,tempAns.n,tempAns.m,tempAns);} if (q.front().m!=0){//M shift//M->StempAns=q.front();A2B(M,S,tempAns.m,tempAns.s,tempAns);//M->NtempAns=q.front();A2B(M,N,tempAns.m,tempAns.n,tempAns);}q.pop();}if (find==false)cout<<"NO"<<endl;}return true;
}


这篇关于九度OJ-1457:非常可乐的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1098134

相关文章

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

C#设计模式(1)——单例模式(讲解非常清楚)

一、引言 最近在学设计模式的一些内容,主要的参考书籍是《Head First 设计模式》,同时在学习过程中也查看了很多博客园中关于设计模式的一些文章的,在这里记录下我的一些学习笔记,一是为了帮助我更深入地理解设计模式,二同时可以给一些初学设计模式的朋友一些参考。首先我介绍的是设计模式中比较简单的一个模式——单例模式(因为这里只牵涉到一个类) 二、单例模式的介绍 说到单例模式,大家第一

【2024 版】最新 kali linux 入门及常用简单工具介绍(非常详细)

一、介绍 kali Linux Kali Linux 是一个基于 Debian 的 Linux 发行版,主要用于数字取证和渗透测试。它预装了大量的安全审计和渗透测试工具,被广泛应用于网络安全领域。 (一)特点 工具丰富:集成了数百种用于渗透测试、漏洞评估、密码破解等方面的工具。开源免费:任何人都可以免费下载和使用,并且可以根据自己的需求进行定制。安全性高:经过严格的安全测试和更新,确保系

九度1077(最大序列和)

题目链接:点击打开链接 解题思路: 很经典的一道题。首先考虑一下细节问题,当序列都是0时,显然最后要输出0;当序列都是负数时,显然要输出最大的数。 细节处理完了,就可以回到正常轨道。我们开两个变量,分别保存当前的序列和与之前的最大值,我们更新当前序列和的条件是如果当前序列和是负数的时候,那我们必须更新,否则一定会使最后结果减小。更新过程中还要更新之前最大值即可。 完整代码:

[置顶] 你必须非常努力,才能看起来毫不费力!(愿与君共勉)

有一群人,他们积极自律,每天按计划行事,有条不紊;他们不张扬,把自己当成最卑微的小草,等待着人生开出花朵的那天。他们早晨5点多起来健身,你在睡觉;7点开始享受丰盛的早餐,蛋白质维生素淀粉粗纤维样样俱全,为新的一天起了一个好头,当他们收拾妥当准备开始一整天的工作时,你还在睡觉;          他们用上午的高效时间完成了一个又一个任务,甚至发现的新的商机,发现了有可能给人生带来改观的机遇

哈理工OJ 2179(深搜)

组合 Time Limit: 1000 MSMemory Limit: 32768 K Total Submit: 7(5 users)Total Accepted: 6(5 users)Rating: Special Judge: No Description 给出一个正整数N,从集合{1,2,3..N} 中找出所有大小为k的子集, 并按照字典序从小到大输出。 Input 第一行是一个整

每日OJ_牛客_求和(递归深搜)

目录 牛客_求和(递归深搜) 解析代码 牛客_求和(递归深搜) 求和_好未来笔试题_牛客网 解析代码         递归中每次累加一个新的数,如果累加和大于等于目标,结束递归。此时如果累加和正好等于目标,则打印组合。向上回退搜索其它组合。此题本身就是一个搜索的过程,找到所有的组合。 #include <iostream>#include <cmath>#in

大模型的学习路线(非常详细)神仙级教程,手把手教会你

如果读者朋友不想深入学习大模型,则了解提示词的使用原则也可以了。要是既不想深入学习,又要做大模型相关的项目,则对于工程同学来说,学习RAG也能把大模型玩转起来(可参考:[大语言模型RAG落地方案]。下面的步骤写给想系统性学习大模型的朋友们。(后续打算写一个大模型学习系列,详细介绍相关知识点,欢迎关注) 先来一张整体结构图,越是下面部分,越是基础: 可以按以下步骤学习: 1. 理解基础概念

AI产品经理:ai产品经理从零基础到精通,非常详细收藏我这一篇就够了

在互联网的浪潮中,AI人工智能领域无疑是最引人注目的风口。AI产品经理,作为这一领域的新兴岗位,以其高薪、低压力、无年龄限制等优势,吸引了众多互联网从业者的目光。随着GPT等AIGC工具的兴起,AI产品经理的市场需求日益增长。 AI产品经理需不需要懂算法?🤔‍‍‍ AI产品经理不必像算法工程师那样精通算法,但必须能够与算法工程师有效沟通,了解如何管理AI项目,协调项目资源。 成功转行AI产

【2024最新】Python入门教程(非常详细)从零基础入门到精通,看完这一篇就够了!

前言 本文罗列了了python零基础入门到精通的详细教程,内容均以知识目录的形式展开。 第一章:python基础之markdown Typora软件下载Typora基本使用Typora补充说明编程与编程语言计算机的本质计算机五大组成部分计算机三大核心硬件操作系统 第二章:编程语言的发展史和第一个Python程序 文件的概念计算机内部数据原理编程语言发展史编程语言的分类python解释器版