优先队列-UVA10603
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
typedef struct state STA;
struct state
{
int cup[],water;
bool operator< (const state p)const
{//优先队列的核心其实在于队列内元素的排列顺序,也就是自定义变量的 < 定义
return this->water > p.water;
}
}; priority_queue<STA> psd;
const int maxn = ;
int vis[maxn][maxn];//采取二维数组的原因之一是:所有状态的可能总数很少
int ans[maxn];
int maxcup[],aimd; int update_ans(STA& p)
{
for(int i=;i<;i++)
{
int t=p.cup[i];
if(ans[t]==-||ans[t]>p.water)ans[t]=p.water;
}
return ;
} int bfs()
{
while(!psd.empty())psd.pop();
memset(vis,,sizeof(vis));
memset(ans,-,sizeof(ans));
scanf("%d%d%d%d",&maxcup[],&maxcup[],&maxcup[],&aimd);
//printf("%d %d %d %d\n",maxcup[0],maxcup[1],maxcup[2],aimd);
STA p;
p.cup[]=;p.cup[]=;
p.water=;p.cup[]=maxcup[];
vis[][]=;
int d=aimd;
//
psd.push(p);
while(!psd.empty())
{
p=psd.top();psd.pop();
update_ans(p);
if(ans[d]>=)break;
//倒水
for(int i=;i<;i++)
{
for(int k=;k<;k++)
{//i与k分别是出水杯与进水杯
if(i==k)continue;
if(p.cup[i]==||p.cup[k]==maxcup[k])continue;
/*很重要的规律*/ int pour_water=min(maxcup[k],p.cup[i]+p.cup[k])-p.cup[k];
STA u;
memcpy(&u,&p,sizeof(p));
u.cup[i]-=pour_water;
u.cup[k]+=pour_water;
u.water+=pour_water;
//
if(!vis[u.cup[]][u.cup[]])
{//由于总水量一定,只要已知其中两个变量就能确定其状态
vis[u.cup[]][u.cup[]]=;
psd.push(u);
}//if
}//in for
}//out for
}//while
//
while(d>=)
{
if(ans[d]>=){printf("%d %d\n",ans[d],d);break;}
else d--;//接近d,从现实的角度而言只能比d小
}
return ;
} int main()
{
//freopen("input.txt","r",stdin);
//freopen("ans.txt","w",stdout);
int n;
scanf("%d",&n);
//printf("n is %d\n",n);
while(n--)bfs();
return ;
}
优先队列-UVA10603的更多相关文章
- 堆排序与优先队列——算法导论(7)
1. 预备知识 (1) 基本概念 如图,(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树.树中的每一个结点对应数组中的一个元素.除了最底层外,该树是完全充满的,而且从左向右填充.堆的数组 ...
- 数据结构:优先队列 基于list实现(python版)
#!/usr/bin/env python # -*- coding:utf-8 -*- #Author: Minion-Xu #list实现优先队列 class ListPriQueueValueE ...
- python优先队列,队列和栈
打印列表的疑问 class Node: def __str__(self): return "haha" print([Node(),Node()]) print(Node()) ...
- 数据结构作业——Sanji(优先队列)
山治的婚约 Description 我们知道,山治原来是地下有名的杀人家族文斯莫克家族的三子,目前山治的弟弟已经出现,叫做四治,大哥二哥就叫汪(One)治跟突(Two)治好了(跟本剧情无关) .山治知 ...
- Java优先队列
按照Java api的说法: java.util.PriorityQueue.PriorityQueue() Creates a PriorityQueue with the default init ...
- 优先队列实现Huffman编码
首先把所有的字符加入到优先队列,然后每次弹出两个结点,用这两个结点作为左右孩子,构造一个子树,子树的跟结点的权值为左右孩子的权值的和,然后将子树插入到优先队列,重复这个步骤,直到优先队列中只有一个结点 ...
- “玲珑杯”ACM比赛 Round #7 B -- Capture(并查集+优先队列)
题意:初始时有个首都1,有n个操作 +V表示有一个新的城市连接到了V号城市 -V表示V号城市断开了连接,同时V的子城市也会断开连接 每次输出在每次操作后到首都1距离最远的城市编号,多个距离相同输出编号 ...
- Dijkstra算法优先队列实现与Bellman_Ford队列实现的理解
/* Dijkstra算法用优先队列来实现,实现了每一条边最多遍历一次. 要知道,我们从队列头部找到的都是到 已经"建好树"的最短距离以及该节点编号, 并由该节点去更新 树根 到其 ...
- 数据结构作业——ギリギリ eye(贪心+优先队列/贪心+并查集)
ギリギリ eye Description A.D.1999,由坠落地球的“谜之战舰”带来的 Over Technology,揭示了人类历史和远古文明之间的丝丝联系, 促使人类终止彼此间的战争,一方面面 ...
随机推荐
- 如何高效地远程部署?自动化运维利器 Fabric 教程
关于 Python 自动化的话题,在上一篇文章中,我介绍了 Invoke 库,它是 Fabric 的最重要组件之一.Fabric 也是一个被广泛应用的自动化工具库,是不得不提的自动化运维利器,所以,本 ...
- 新的征程TestOps
TestOps 概念是什么时候提出来的没有去考察,知道TestOps测试运维是在DevOps这个概念下抽象的结果. DevOps,现在几乎每家公司都在谈DevOps,都已经实施,在实施,或者在准备实施 ...
- Python3 (五)函数应用
一.认识函数 在命令行中查看内置函数的方法: 1.先在命令行里输入python 2.help(函数) 二.函数的定义及运行特点 1.函数基本定义: def funcname(parameter_lis ...
- python os和sys模块使用
python os和sys模块使用 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相 ...
- Eclipse 无法引用到Maven 解决方法
问题描述:打开Eclipse进入java EE视图下,发现原有的Maven Dependencies目录不存在,显示的是org.maven.ide.eclipse.MAVEN2_CLASSPATH_C ...
- 论文翻译:2018_Artificial Bandwidth Extension with Memory Inclusion using Semi-supervised Stacked Auto-encoders
论文地址:使用半监督堆栈式自动编码器实现包含记忆的人工带宽扩展 作者:Pramod Bachhav, Massimiliano Todisco and Nicholas Evans 博客作者:凌逆战 ...
- vs code支持 es6, node.js 语法提示
npm install --save-dev @types/node 安装这个东西就可以了, 代码拷走, 回去愉快的敲代码吧
- [LeetCode] [链表] 相关题目总结
刷完了LeetCode链表相关的经典题目,总结一下用到的技巧: 技巧 哑节点--哑节点可以将很多特殊case(比如:NULL或者单节点问题)转化为一般case进行统一处理,这样代码实现更加简洁,优雅 ...
- [MySQL]ANALYZE TABLE 更新索引基数
MySQL使用存储的键分布基数来确定表连接顺序在决定对查询中的特定表使用哪些索引时,也会使用使用键分布基数 ANALYZE TABLE 表名 可以更新表的索引基数,使其更接近非重复的记录数,记录数可以 ...
- web自动化之三大等待
这个假期有些长,长到忘记了要学习,要找工作,好吧,在我每天无休止的追着偶像剧时,我确实没有负罪感,在听了小祥大佬的分享后,我连睡午觉都被吓醒.大佬跟我同一个班,在大厂工作,每天还抽时间学习,作业也没落 ...