FOJ Problem 1081 等分液体
来源:互联网 发布:第三次农业普查数据 编辑:程序博客网 时间:2024/06/11 16:21
Problem Description
有三种容器R1,R2,R3,其容积分别是L,M,N。L,M,N 都是正整数且L=M+N。今R1 装满液体,试用最少的操作步骤 将 R1 中的液体均分。
Input
第一行仅包含一个表示测试例个数的正整数n 。以下n 行为 n个测试例的输入数据。每个测试例仅有一行输入数据,含三个正整数L,M,N (1<=L,M,N<=150),两数间用一个空格隔开。
Output
每个测试例都仅有一行输出,若有解,输出操作的次数,若无解则输出“no”。
Sample Input
3
100 70 30
90 60 30
80 45 35
Sample Output
9
no
有三种容器R1,R2,R3,其容积分别是L,M,N。L,M,N 都是正整数且L=M+N。今R1 装满液体,试用最少的操作步骤 将 R1 中的液体均分。
Input
第一行仅包含一个表示测试例个数的正整数n 。以下n 行为 n个测试例的输入数据。每个测试例仅有一行输入数据,含三个正整数L,M,N (1<=L,M,N<=150),两数间用一个空格隔开。
Output
每个测试例都仅有一行输出,若有解,输出操作的次数,若无解则输出“no”。
Sample Input
3
100 70 30
90 60 30
80 45 35
Sample Output
9
no
15
这一题我当做搜索题来做,既然说是最少,当然第一想到优先队列是不是,然后每一次从最少步数的那一个节点开始继续往后搜索
# include <iostream># include <string.h># include <queue># include <algorithm>using namespace std;struct state{//每一个状态int v[4];//三个杯子,下标从一开始int cnt;//当前步数bool operator <(const state& rhs) const{return cnt>rhs.cnt;}};priority_queue<state> q;//优先队列int vis[160][160];//记录是否被访问过int main(){int t, i, j, k, d;int cup[4];//三个杯子容量cin>>t;for(i=1; i<=t; i++){cin>>cup[1]>>cup[2]>>cup[3];if(cup[1]%2==1){//奇数没有办法均分printf("no\n");continue;}memset(vis, 0, sizeof(vis));while(!q.empty()){q.pop();}d=cup[1]/2;//目标struct state start;//开始状态start.v[1]=cup[1];start.v[2]=0;start.v[3]=0;start.cnt=0;vis[start.v[1]][start.v[2]]=vis[start.v[2]][start.v[1]]=1;//第一个状态标记为已经出现q.push(start);int flage=0;while(!q.empty()){struct state temp=q.top();q.pop();if(temp.v[1]==d||temp.v[2]==d||temp.v[3]==d){//到达目标printf("%d\n", temp.cnt+1);flage=1;break;}for(j=1; j<=3; j++){//从第j个杯子倒到第k个for(k=1; k<=3; k++){if(j!=k){if(temp.v[j]==0||temp.v[k]==cup[k]){//操作失败继续下一种策略continue;}else{struct state _temp;memcpy(&_temp, &temp, sizeof(temp));//备份一下,不能破坏tempint amount=min(cup[k], temp.v[j]+temp.v[k])-temp.v[k];//计算到水量_temp.v[j]=temp.v[j]-amount;//更新_temp.v[k]=temp.v[k]+amount;//更新_temp.cnt++;//更新if(vis[_temp.v[j]][_temp.v[k]]==0&&vis[_temp.v[k]][_temp.v[j]]==0){//找到新状态,入队q.push(_temp);vis[_temp.v[j]][_temp.v[k]]=vis[_temp.v[k]][_temp.v[j]]=1;}}}}}}if(!flage){//没找到printf("no\n");}}return 0;}
0 0
- FOJ Problem 1081 等分液体
- foj1081等分液体
- c语言解 等分液体
- FOJ 1692 Key problem
- FOJ Problem 1099 Square
- FOJ-2214 Knapsack problem
- FOJ Problem 2221 RunningMan
- FOJ Problem 2214 Knapsack problem
- FOJ 1350 Very Simple Problem
- foj 1971 A math problem
- Foj 2164 Jason's problem
- 【FOJ 1350】 Very Simple Problem
- foj 1350 Very Simple Problem
- FOJ Problem 1004 Number Triangle
- FOJ Problem 1011 Power Strings
- FOJ Problem 1077 铁皮容器
- FOJ Problem 1062 洗牌问题
- FOJ Problem 1003 Counterfeit Dollar
- iOS根据2个经纬度计算距离
- sunjce iOS des 3des解密加密
- Javaweb开发错误关于web.xml
- (4.5.1.4)Import Project(Eclipse ADT, Gradle,etc)(包括导入第三方Project项目(不是jar包形式))
- mysql dump备份方式 mysql还原操作练习
- FOJ Problem 1081 等分液体
- 摘抄:项目经理需知道的16件事
- git 常用命令
- 欧拉项目第15题 Lattice paths
- android 多线程数据库读写分析与优化
- iOS 文本计算
- nodejs4.4.0安装Linux
- 从零开始学习EasyDarwin之无锁队列
- Iterator的remove()和Collection的remove()