优先队列-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,揭示了人类历史和远古文明之间的丝丝联系, 促使人类终止彼此间的战争,一方面面 ...
随机推荐
- 编写SQL语句(快速回顾)
注:源自于<Java程序员面试秘笈>! 1.创建数据库MYDB create database MYDB 2.创建学生表student (sno,sname,ssex,sage,sclas ...
- ASP.NET Core 2.2 WebApi 系列【九】使用SignalR (作者:tenghao510 ) 学习及内容补充
原文地址: ASP.NET Core 2.2 WebApi 系列[九]使用SignalR 今天,看到了大牛的这篇博文, 发了一下评论, 我很惊喜, 没想到他很快就回复了我, 而且通过QQ帮助了S ...
- js - 面向对象 - 小案例:轮播图、随机点名、选项卡、鼠标拖拽
面向对象 对象 : (黑盒子)不了解内部结构, 知道表面的各种操作. 面向对象 : 不了解原理的情况下 会使用功能 . 面向对象是一种通用思想,并非编程中能用,任何事情都能用. 编程语言的面向对象的特 ...
- javascript原生js轮播图
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Linux ftp VSftp
一.Linux FTP服务器分类: <1>wu-ftp <2>proftp=profession ftp <3>vsftp=very security ftp 本 ...
- win7下彻底卸载和重装mysql
1 .目的:第一次安装完mysql后忘记了临时密码,通过各种途径都无法更改密码,因此不得不把mysql卸载了. 2 .建议:第一次安装mysql时会分配一个临时密码,如最后一行的se_:j<tq ...
- Day17-18前端学习之路——Javascript事件
用户在某个元素上点击鼠标或悬停光标. 用户在键盘中按下某个按键. 用户调整浏览器的大小或者关闭浏览器窗口. 一个网页停止加载. 提交表单. 播放.暂停.关闭视频. 发生错误. 更多事件:https:/ ...
- 解决github图片不显示的问题
修改hosts C:\Windows\System32\drivers\etc\hosts 在文件末尾添加: # GitHub Start 192.30.253.112 Build software ...
- zabbix性能问题
在我们的zabbixserver端主机数量过多时,如果由server端去收集数据,zabbix会出现严重的性能问题,主要的表现有: 1.当被监控端达到一个量级的时候,web操作会卡,容易出现502 2 ...
- form中label标签对齐,内容右对齐
给label设置一个固定长度即可: label{ display:inline-block; width:100px; text-align:right; }