当前位置: 首页 > news >正文

1169: PIPI倒水

为什么ans[d]!=-1的时候,就可以return了?
因为使用小根堆,队列后面的节点的倒水量都比现在大,即使后面的节点也可以通过倒水出现d也没用了。

????????
哈哈哈哈哈处是两种代码不一样的地方。
我认为应该等到访问节点的时候,在设置vis为1,而不是在插入的时候,就设置为1。
因为访问节点A的时候插入节点C1,访问节点B的时候像插入节点C2.即使B在A之后,(C1和C2的三杯水相同)不代表A找到的C1一定比C2小吧?但是代码一会不让C2插入优先队列
但是代码2,就可以让C1和C2都插入,且C2会比C1先成为小根堆的堆顶,然后C2先更新ans。

#include <bits/stdc++.h>
using namespace std;
const int N=210;
int cap[3],d; //三个杯子的容量,目标值 
struct node{int water[3];int dao;//达到当前节点,已经倒的水量bool operator<(const node& a) const{return dao>a.dao;} 
};
int vis[N][N]; //坐标x,y代表第一杯水和第二杯水的水量 
int ans[N];    
void bsf(priority_queue<node> q){memset(ans,-1,sizeof(ans));memset(vis,0,sizeof(vis));ans[cap[2]]=0;ans[0]=0;vis[0][0]=1;while(!q.empty()){auto now=q.top();q.pop();for(int i=0;i<3;i++){if(ans[now.water[i]]==-1||ans[now.water[i]]>now.dao)ans[now.water[i]]=now.dao;}if(ans[d]!=-1){return;}for(int i=0;i<3;i++){for(int j=0;j<3;j++){if(i==j)	continue;if(now.water[i]==0||now.water[j]==cap[j])continue;int pour=min(now.water[i],cap[j]-now.water[j]);node next=now;next.water[i]-=pour;next.water[j]+=pour;next.dao+=pour;if(!vis[next.water[0]][next.water[1]]){vis[next.water[0]][next.water[1]]=1; //哈哈哈哈哈哈哈哈哈q.push(next); }}}}
}
int main(){int t;scanf("%d",&t);while(t--){scanf("%d%d%d%d",&cap[0],&cap[1],&cap[2],&d);node p; p.dao=0; p.water[2]=cap[2];p.water[0]=0;p.water[1]=0;priority_queue<node> q; //关于倒水量的小根堆 q.push(p);bsf(q);for(int i=d;i>0;i--){if(ans[i]!=-1){printf("%d %d\n",ans[i],i);break;}if(i==1){printf("%d %d\n",0,0);}}}return 0;
}

#include <bits/stdc++.h>
using namespace std;
const int N=210;
int cap[3],d; //三个杯子的容量,目标值 
struct node{int water[3];int dao;//达到当前节点,已经倒的水量bool operator<(const node& a) const{return dao>a.dao;} 
};
int vis[N][N]; //坐标x,y代表第一杯水和第二杯水的水量 
int ans[N];    
void bsf(priority_queue<node> q){memset(ans,-1,sizeof(ans));memset(vis,0,sizeof(vis));ans[cap[2]]=0;ans[0]=0;      while(!q.empty()){auto now=q.top();q.pop();vis[now.water[0]][now.water[1]]=1;        //哈哈哈哈哈哈哈哈哈for(int i=0;i<3;i++){if(ans[now.water[i]]==-1||ans[now.water[i]]>now.dao)ans[now.water[i]]=now.dao;}if(ans[d]!=-1){return;}for(int i=0;i<3;i++){for(int j=0;j<3;j++){if(i==j)	continue;if(now.water[i]==0||now.water[j]==cap[j])continue;int pour=min(now.water[i],cap[j]-now.water[j]);node next=now;next.water[i]-=pour;next.water[j]+=pour;next.dao+=pour;if(!vis[next.water[0]][next.water[1]]){q.push(next); }}}}
}
int main(){int t;scanf("%d",&t);while(t--){scanf("%d%d%d%d",&cap[0],&cap[1],&cap[2],&d);node p; p.dao=0; p.water[2]=cap[2];p.water[0]=0;p.water[1]=0;priority_queue<node> q; //关于倒水量的小根堆 q.push(p);bsf(q);for(int i=d;i>0;i--){if(ans[i]!=-1){printf("%d %d\n",ans[i],i);break;}if(i==1){printf("%d %d\n",0,0);}}}return 0;
}
http://www.jsqmd.com/news/371457/

相关文章:

  • 数据库系统概论第二章关系数据库
  • AI原生应用里自然语言处理的核心算法解析
  • 数据库系统概论第三章关系数据库标准语言SQL
  • Eureka在大数据领域的核心作用揭秘
  • 突破查重难关!7大AI降重方案解析
  • 毕业论文AI工具推荐:5个高效选择
  • 击穿膨胀痛点:OpenTeleDB 源码编译与 XStore 引擎极限抗压实录
  • 纠结论文写作?5款AI工具实测排名解析
  • 5个靠谱AI写作网站,解决毕业论文纠结问题
  • 5个高评分AI写作网站,论文效率翻倍
  • 构建之法阅读笔记3
  • 2026年踩了5次坑后,我终于搞懂了降AI率的正确姿势
  • 再讨论一次视频平台接入摄像机要注意的问题
  • C# `async/await` 技术笔记
  • 论文降重指南:7个AI工具实测推荐
  • 降AI率工具怎么用?从上传到出结果手把手教你3步搞定
  • 【易经系列】《蒙卦》六三:勿用取女,见金夫,不有躬,无攸利。
  • 虚拟机工具选择指北
  • Seedance 2.0 完整使用指南:字节最新视频生成模型的两种开通方案
  • 时序数据库选型深度指南:从大数据视角与主流产品对比,聚焦Apache IoTDB
  • 55261
  • Java异常处理深度解析:从原理到最佳实践
  • 所以我放弃了OI
  • STM32_GPIO输入
  • Gemini无法使用问题解决
  • 5大AI论文写作网站排名,告别选择困难
  • USBASP应用PROGISP的问题:都是时钟速度惹的祸
  • 完整教程:Scala 泛型
  • 2026年降AIGC率用什么工具好?花了200块实测出这份清单
  • 毕业论文神器:5个AI写作平台横向对比