紫皮书的例题

照着敲了一遍,非原创

大题思路主要是三杯水,而水的总数是知道的,相当于知道第一第二杯水的体积,第三杯水的体积也就确定了。

用第一第二杯水的体积来标记数组是否遍历过

优先队列来找移动体积最少的

主要update_ans()函数进行每次判断

void update_ans(Node & u){
for(int i = ;i < ;i++){
int d = u.v[i];
if(ans[d] < || ans[d] > u.dist)
ans[d] = u.dist;
}
}

然后就是找第i杯水应该往第j杯水移动水的体积

符合条件进行入队操作

最后在ans数组寻找合适的解……!!!

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <stack>
#include <cctype>
#include <string>
#include <malloc.h>
#include <queue>
#include <map> using namespace std; const int INF = 0xffffff;
const double esp = 10e-;
const double Pi = * atan(1.0);
const int Maxn = +;
const int mod = ;
const int dr[] = {,,-,,-,,-,};
const int dc[] = {,,,-,,-,-,}; struct Node{
int v[];
int dist;
bool operator < (const Node & rhs)const{
return dist > rhs.dist;
}
}; int vis[Maxn][Maxn],cap[],ans[Maxn]; void update_ans(const Node & u){
for(int i = ;i < ;i++){
int d = u.v[i];
if(ans[d] < || u.dist < ans[d])
ans[d] = u.dist;
}
} void solve(int a,int b,int c,int d){
cap[] = a,cap[] = b,cap[] = c;
memset(vis,,sizeof(vis));
memset(ans,-,sizeof(ans));
priority_queue<Node>q; Node start;
start.dist = ;
start.v[] = ;
start.v[] = ;
start.v[] = c;
q.push(start); vis[][] = ;
while(!q.empty()){
Node u = q.top();
q.pop();
update_ans(u);
if(ans[d] >= )
break;
for(int i = ;i < ;i++){
for(int j = ;j < ;j++){
if(i == j){
continue;
}
if(u.v[i] == || u.v[j] == cap[j])
continue;
int amount = min(cap[j],u.v[i]+u.v[j]) - u.v[j];///计算将i倒入j的数量
Node u2;
memcpy(&u2,&u,sizeof(u));
u2.dist = u.dist + amount;
u2.v[i] -= amount;
u2.v[j] += amount;
if(!vis[u2.v[]][u2.v[]]){
vis[ u2.v[] ][u2.v[] ] = ;
q.push(u2);
}
}
}
}
while(d >= ){
if(ans[d] >= ){
printf("%d %d\n",ans[d],d);
return;
}
d--;
}
} int main()
{
#ifndef ONLINE_JUDGE
freopen("inpt.txt","r",stdin);
#endif
int T,a,b,c,d;
scanf("%d",&T);
while(T--){
scanf("%d%d%d%d",&a,&b,&c,&d);
solve(a,b,c,d);
}
return ;
}

最新文章

  1. 使用独立模式安装Sharepoint Server 2013出现创建示例数据错误的解决方案
  2. Html--表单练习
  3. IOS中的Block与C++11中的lambda
  4. kafka java实例
  5. 基本数据类型-列表_元组_字典_day4
  6. settimeout,cleartimeout的使用分析
  7. hdu 1700 Points on Cycle(坐标旋转)
  8. 利用Modbus协议读取电能表的数据
  9. iostat来对linux硬盘IO性能进行了解
  10. Android Canvas不能换行,或者不识别\n,\r\n的解决方案
  11. 201521123042 《java程序设计》 第八周学习总结
  12. 如何设置html中img宽高相同-css
  13. POJ2513 欧拉 + 字典树
  14. python之str字符串
  15. 02_计算机网络的OSI七层(应表会传网数物)
  16. Java高并发系列 — AQS
  17. 【Java】 剑指offer(44) 连续子数组的最大和
  18. Sql Server Tempdb原理-日志机制解析实践
  19. 20155234 2016-2017-2 《Java程序设计》第7周学习总结
  20. Java 中 Map与JavaBean实体类之间的相互转化

热门文章

  1. 15个最受欢迎的Python开源框架
  2. kvm libvirt: hostdev passthrough support 解决加密狗冲突问题
  3. 什么是C# Lambda表达式?形如:p=&gt;p.abc
  4. C# 课堂总结4-类(常用的类)
  5. BZOJ 4057: [Cerc2012]Kingdoms( 状压dp )
  6. 使用ant的jar任务打jar包
  7. 网络授时服务 NTP
  8. servlet的filter的使用
  9. python 求值表达式解析
  10. Java的位运算符具体解释实例——与(&amp;amp;)、非(~)、或(|)、异或(^)