【HDU1495非常可乐】【POJ3414Pots】

2024-03-04 03:08

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

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

 

//用bfs模拟6种情况来写的,麻烦到爆炸
#include <iostream>
#include<cstdio>
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
typedef long long ll;
int s,n,m;
struct node{int s,n,m,step;
};
int vis[105][105][105];
void bfs(){if(s%2==1){printf("NO\n");return;}memset(vis,0,sizeof(vis));node point;point.s=s, point.n=0, point.m=0, point.step=0;queue<node>q;q.push(point);vis[point.s][point.n][point.m]=1;while(!q.empty()){node p=q.front();q.pop();node tmp;if((p.s==p.n&&p.s==s/2)||(p.s==p.m&&p.s==s/2)||(p.n==p.m&&p.n==s/2)){printf("%d\n",p.step);return ;}// s-->nif(p.s&&(n>p.n)){if(p.s>n-p.n){tmp.s=p.s-(n-p.n);tmp.n=n;tmp.m=p.m;}else{tmp.s=0;tmp.n=p.n+p.s;tmp.m=p.m;}if(!vis[tmp.s][tmp.n][tmp.m]){vis[tmp.s][tmp.n][tmp.m]=1;tmp.step=p.step+1;q.push(tmp);}}//s-->mif(p.s&&m>p.m){if(p.s>m-p.m){tmp.s=p.s-(m-p.m);tmp.n=p.n;tmp.m=m;}else{tmp.s=0;tmp.n=p.n;tmp.m=p.m+p.s;}if(!vis[tmp.s][tmp.n][tmp.m]){vis[tmp.s][tmp.n][tmp.m]=1;tmp.step=p.step+1;q.push(tmp);}}// n-->sif(p.n&&s>p.s){if(p.n>s-p.s){tmp.s=s;tmp.n=p.n-(s-p.s);tmp.m=p.m;}else{tmp.s=p.s+p.n;tmp.n=0;tmp.m=p.m;}if(!vis[tmp.s][tmp.n][tmp.m]){vis[tmp.s][tmp.n][tmp.m]=1;tmp.step=p.step+1;q.push(tmp);}}// n-->mif(p.n&&m>p.m){if(p.n>m-p.m){tmp.s=p.s;tmp.n=p.n-(m-p.m);tmp.m=m;}else{tmp.s=p.s;tmp.n=0;tmp.m=p.m+p.n;}if(!vis[tmp.s][tmp.n][tmp.m]){vis[tmp.s][tmp.n][tmp.m]=1;tmp.step=p.step+1;q.push(tmp);}}// m-->sif(p.m&&s>p.s){if(p.m>s-p.s){tmp.s=s;tmp.n=p.n;tmp.m=p.m-(s-p.s);}else{tmp.s=p.s+p.m;tmp.n=p.n;tmp.m=0;}if(!vis[tmp.s][tmp.n][tmp.m]){vis[tmp.s][tmp.n][tmp.m]=1;tmp.step=p.step+1;q.push(tmp);}}// m-->nif(p.m&&n>p.n){if(p.m>n-p.n){tmp.s=p.s;tmp.n=n;tmp.m=p.m-(n-p.n);}else{tmp.s=p.s;tmp.n=p.n+p.m;tmp.m=0;}if(!vis[tmp.s][tmp.n][tmp.m]){vis[tmp.s][tmp.n][tmp.m]=1;tmp.step=p.step+1;q.push(tmp);}}}printf("NO\n");return;
}
int main(){while(scanf("%d%d%d",&s,&n,&m)!=EOF){if(s+n+m==0)break;bfs();}return 0;
}

开始看到就是一个数学思想,结果没有推出来
 

#include <iostream>#include<cstdio>#include <iostream>#include <cstring>#include <queue>using namespace std;typedef long long ll;int gcd(int a,int b){if(a%b==0) return b;return gcd(b,a%b);}int main(){int s,n,m;while(scanf("%d%d%d",&s,&n,&m)!=EOF){if(s+n+m==0)break;if(s&1){printf("NO\n");continue;}int d=gcd(n,m); //if(s%d){printf("NO\n");continue;}d=gcd(s,d);if((s/d)&1) {printf("NO\n");continue;}else {printf("%d\n",s/d-1);}}return 0;}

POJ3414Pots
给出两个壶的容量A和B, 一个目标水量C,对A、B可以有3种操作,求最少经过几步操作能够在某个壶中得到目标水量C。输入A、B和C,输入最少操作数和操作过程。
这道题和上一道搜索题目的建模是几乎一样,要说不一样的,也没啥不一样的了 .
需要记录最短路径
那道题是有三个杯子可以相互作为中间态,一种有六种状态进行到水,这个虽然只有2个杯子,一个理论的状态量,但限制了给定3种倒水策略
所以还是6中方式(太麻烦了,bfs都这么长
 


#include <iostream>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <queue>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=105;
int vis[maxn][maxn];
int n,m,enen;
struct node{
int x,y;
int step;
char path[maxn];
int cnt;
};
string path[] = {"FILL(1)","FILL(2)","DROP(1)","DROP(2)","POUR(1,2)","POUR(2,1)"};
void work(int step,char pa[],int cnt){printf("%d\n",step);for(int i=0;i<cnt;++i)cout<<path[pa[i]]<<endl;}
void bfs(){queue<node>q;memset(vis,0,sizeof(vis));node p,tmp;p.x=0,p.y=0,p.step=0,p.cnt=0;vis[0][0]=1;q.push(p);while(!q.empty()){p=q.front();q.pop();//   cout<<p.x<<' '<<p.y<<endl;if(p.x==enen||p.y==enen){work(p.step,p.path,p.cnt);return ;}tmp=p;tmp.step++;tmp.cnt++;//FILL(n)if(n>p.x){tmp.x=n;tmp.y=p.y;if(!vis[tmp.x][tmp.y]){tmp.path[p.cnt]=0;q.push(tmp);vis[tmp.x][tmp.y]=1;}}//Fill(m)if(m>p.y){tmp.x=p.x;tmp.y=m;if(!vis[tmp.x][tmp.y]){tmp.path[p.cnt]=1;q.push(tmp);vis[tmp.x][tmp.y]=1;}}//DROP(n)if(p.x){tmp.x=0,tmp.y=p.y;if(!vis[tmp.x][tmp.y]){tmp.path[p.cnt]=2;q.push(tmp);vis[tmp.x][tmp.y]=1;}}//DROP(m)if(p.y){tmp.x=p.x;tmp.y=0;if(!vis[tmp.x][tmp.y]){tmp.path[p.cnt]=3;q.push(tmp);vis[tmp.x][tmp.y]=1;}}//POUR(n,m)if(p.x&&(p.y<m)){if(p.x>(m-p.y)){tmp.x=p.x-(m-p.y);tmp.y=m;}else{tmp.x=0;tmp.y=p.y+p.x;}if(!vis[tmp.x][tmp.y]){tmp.path[p.cnt]=4;q.push(tmp);vis[tmp.x][tmp.y]=1;}}//POUR(m,n)if(p.y&&(p.x<n)){if(p.y>(n-p.x)){tmp.x=n;tmp.y=p.y-(n-p.x);}else{tmp.x=p.x+p.y;tmp.y=0;}if(!vis[tmp.x][tmp.y]){tmp.path[p.cnt]=5;q.push(tmp);vis[tmp.x][tmp.y]=1;}}}printf("impossible\n");
}
int main(){while(scanf("%d%d%d",&n,&m,&enen)!=EOF){bfs();}return 0;
}

 

这篇关于【HDU1495非常可乐】【POJ3414Pots】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

神仙级AI大模型入门教程(非常详细),从零基础入门到精通,从看这篇开始!

一.初聊大模型 1.为什么要学习大模型? 在学习大模型之前,你不必担心自己缺乏相关知识或认为这太难。我坚信,只要你有学习的意愿并付出努力,你就能够掌握大模型,并能够用它们完成许多有意义的事情。在这个快速变化的时代,虽然新技术和概念不断涌现,但希望你能静下心来,踏实地学习。一旦你精通了某项技术,你就能够用它来实现自己的目标,甚至可能找到理想的工作或完成具有挑战性的项目。 在众多的技术中,大模型

大模型产品经理学习路线,2024最新,从零基础入门到精通,非常详细收藏我这一篇

随着人工智能技术的发展,尤其是大模型(Large Model)的兴起,越来越多的企业开始重视这一领域的投入。作为大模型产品经理,你需要具备一系列跨学科的知识和技能,以便有效地推动产品的开发、优化和市场化。以下是一份详细的大模型产品经理学习路线,旨在帮助你构建所需的知识体系,从零基础到精通。 一、基础知识阶段 1. 计算机科学基础 数据结构与算法:理解基本的数据结构(如数组、链表、树、图等)和

Java工程师成神之路 --一篇非常好的文章,让人获益匪浅!!!

一、基础篇 1.1 JVM 1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收 http://www.jcp.org/en/jsr/detail?id=133 http://ifeve.com/jmm-faq/ 1.1.2. 了解JVM各种参数及调优 1.1.3. 学习使用Java工具 jps, jstack, jmap, jconsole