#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. C和C++中字符串与数的转换

    以下内容来自<C/C++程序设计实用案例教程> 1.在C语言中的转换方式 1.1数字转换为字符串 在C语言中,sprintf函数可以将任何多个数字格式化为指定格式的字符串,sprintf函 ...

  2. 我的一个React路由嵌套(多级路由),路由传参之旅

    在上一篇react路由之旅中,我们简单地配置了react,进行了react路由及相关知识的学习,引入以及实现一个局部跳转的功能,接下来就是深入学习路由的嵌套以及传参,这是工作中主要用要的. 我的rea ...

  3. linux的那些事-时间 时区

    时间表示: 用法:date [选项]... [+格式] 或:date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] 以给定的格式显示当前时间,或是设置系 ...

  4. 解决shiro自定义filter后,ajax登录无法登录,并且无法显示静态资源的问题

    这个问题困扰了我一天,看了下面两个文章,豁然开朗: https://www.cnblogs.com/gj1990/p/8057348.html https://412887952-qq-com.ite ...

  5. Vue-20190623点滴

    Vue-20190623点滴 推荐黄奕同学vue的学习方式和过程. https://juejin.im/post/5b18d2d7f265da6e410e0e20 ♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣♣ ...

  6. asp.net MVC项目开发之统计图echarts饼形图(二)

    上面介绍了柱状图,只有js代码后台的传递等我们介绍完饼形图的使用过程在做介绍 有了柱状图的介绍,在使用饼形图,其实很容易了,上代码 1.首先加载网页时,需要用到的加载项和事件. //打开网页加载 $( ...

  7. C#设计模式学习笔记:(19)策略模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8057654.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第七个模式--策 ...

  8. Ream--(objc)写事务精简方案

    Ream--(objc)写事务精简方案 地址: REALM-- Realm官方提供的的写事务有两种方式: A[realm beginWriteTransaction]; // ... [realm c ...

  9. 10.Android-SharedPreferences使用

    1.SharedPreferences介绍 SharedPreferences,它是一个轻量级的配置文件类,用于保存软件配置参数. 采用xml文件形式存储在/data/data/包名/shared_p ...

  10. 全面解析百度大脑发布“AI开发者‘战疫’守护计划”

    即日起,百度大脑发布“AI开发者战疫守护计划” 大疫当前,人人有责,携手开发者共同出击抗击疫情 基于百度大脑AI开放平台和飞桨深度学习平台,积极运用算法.算力.软件等“武器”助力抗疫!   谁能参与计 ...