#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的更多相关文章

  1. 堆排序与优先队列——算法导论(7)

    1. 预备知识 (1) 基本概念     如图,(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树.树中的每一个结点对应数组中的一个元素.除了最底层外,该树是完全充满的,而且从左向右填充.堆的数组 ...

  2. 数据结构:优先队列 基于list实现(python版)

    #!/usr/bin/env python # -*- coding:utf-8 -*- #Author: Minion-Xu #list实现优先队列 class ListPriQueueValueE ...

  3. python优先队列,队列和栈

    打印列表的疑问 class Node: def __str__(self): return "haha" print([Node(),Node()]) print(Node()) ...

  4. 数据结构作业——Sanji(优先队列)

    山治的婚约 Description 我们知道,山治原来是地下有名的杀人家族文斯莫克家族的三子,目前山治的弟弟已经出现,叫做四治,大哥二哥就叫汪(One)治跟突(Two)治好了(跟本剧情无关) .山治知 ...

  5. Java优先队列

    按照Java api的说法: java.util.PriorityQueue.PriorityQueue() Creates a PriorityQueue with the default init ...

  6. 优先队列实现Huffman编码

    首先把所有的字符加入到优先队列,然后每次弹出两个结点,用这两个结点作为左右孩子,构造一个子树,子树的跟结点的权值为左右孩子的权值的和,然后将子树插入到优先队列,重复这个步骤,直到优先队列中只有一个结点 ...

  7. “玲珑杯”ACM比赛 Round #7 B -- Capture(并查集+优先队列)

    题意:初始时有个首都1,有n个操作 +V表示有一个新的城市连接到了V号城市 -V表示V号城市断开了连接,同时V的子城市也会断开连接 每次输出在每次操作后到首都1距离最远的城市编号,多个距离相同输出编号 ...

  8. Dijkstra算法优先队列实现与Bellman_Ford队列实现的理解

    /* Dijkstra算法用优先队列来实现,实现了每一条边最多遍历一次. 要知道,我们从队列头部找到的都是到 已经"建好树"的最短距离以及该节点编号, 并由该节点去更新 树根 到其 ...

  9. 数据结构作业——ギリギリ eye(贪心+优先队列/贪心+并查集)

    ギリギリ eye Description A.D.1999,由坠落地球的“谜之战舰”带来的 Over Technology,揭示了人类历史和远古文明之间的丝丝联系, 促使人类终止彼此间的战争,一方面面 ...

随机推荐

  1. layui表格增删改查与上传图片+Api

    API  控制器1 主要用于增删改查已经反填数据查询 using System; using System.Collections.Generic; using System.Data.SqlClie ...

  2. Go语言实现:【剑指offer】序列化二叉树

    该题目来源于牛客网<剑指offer>专题. 请实现两个函数,分别用来序列化和反序列化二叉树. 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建 ...

  3. 《Head first设计模式》之装饰者模式

    装饰者模式动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案. 星巴兹是以扩张速度最快而闻名的咖啡连锁店.由于扩张速度太快,他们准备更新订单系统,以合乎他们的饮料供应要求. ...

  4. LwIP与IPv6

    2.0.0中才开始支持IPv6,在此版本中改写了SNMP,但还没有IPv6的统计量.目前最新版本是2.0.2,其中SNMP也没有IPv6统计量(哪些?与IP的统计量有何区别?) 1.4.1中虽然有ip ...

  5. Nginx 主要应用场景

    前言 本文只针对 Nginx 在不加载第三方模块的情况能处理哪些事情,由于第三方模块太多所以也介绍不完,当然本文本身也可能介绍的不完整,毕竟只是我个人使用过和了解到过得.所以还请见谅,同时欢迎留言交流 ...

  6. centos容器yum安装JDK环境

    1.yum命令安装jdk 选择版本安装 -openjdk java--openjdk-devel 或者如下命令,安装jdk1.8.0的所有文件 -openjdk*yum install -y java ...

  7. pikachu-反序列化漏洞

    1.序列化的概念(摘自pikachu平台的介绍) (1)序列化serialize() 序列化说通俗点就是把一个对象变成可以传输的字符串,比如下面是一个对象:   class S{ public $te ...

  8. Elasticsearch之集群

    ElasticSearch集群 ES集群是一个 P2P类型(使用 gossip 协议)的分布式系统,除了集群状态管理以外,其他所有的请求都可以发送到集群内任意一台节点上,这个节点可以自己找到需要转发给 ...

  9. 手把手教你搭建 ELK 实时日志分析平台

    本篇文章主要是手把手教你搭建 ELK 实时日志分析平台,那么,ELK 到底是什么呢? ELK 是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch.Logstash 和 Kiban ...

  10. C# 根据天、周、月汇总统计生成统计报表

    先看核心代码: public List<DataEntity> SearchShopSalesReport(DateTimeOffset? dateFrom, DateTimeOffset ...