热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

hihocoder二分·二分答案【二分搜索,最大化最小值】(bfs)

题目这道题做了几个小时了都没有做出来,首先是题意搞了半天都没有弄懂,难道真的是因为我不打游戏所以连题都读不懂了?反正今天是弄不懂了&#

题目

这道题做了几个小时了都没有做出来,首先是题意搞了半天都没有弄懂,难道真的是因为我不打游戏所以连题都读不懂了?

反正今天是弄不懂了,过几天再来看看。。。

题意:一个人从1点出发到T点去打boss,这个人有两个属性值,防御值和战斗值,这两个值成反比,为了打赢boss我们要使战斗值最大,于是乎防御值就要最低,但是也不能太低,于是乎这个界限在哪,这就是我们要求的。每条路上都有一个索敌值,防御值必须>=索敌值 才能通过。从1点到T点有很多条通路,我们要找的是:这每一条通路中索敌值最大的中索敌值最小的,感觉这句话有点绕,具体解释看下图:

1号节点是起点,5号是终点,从1到5有三条通路:1->2->5; 1->3->5; 1->4->5; 对应路径中最长的路段长度分别是:3;5;4;因此在{3,5,4}中最小值3是正确值。

所以这道题是用二分求,最大化最小值。

#include
using namespace std;int n,m,k,t;
const int Max = 10005;
int vis[Max];struct edge{int x,w;
};
vector v[Max];int bfs(int dis)
{memset(vis,0,sizeof(vis));queue q;q.push(1);while(!q.empty()){int cur = q.front();q.pop();if(cur==t) return true;if(vis[cur]==k)continue;int l = v[cur].size();for(int i=0;idis)continue;vis[tmp]=vis[cur]+1;q.push(tmp);}}return false;
}int main()
{int a,b,c;while(~scanf("%d%d%d%d",&n,&m,&k,&t)){int a,b,c,maxn=0;for(int i=0;i}

 


推荐阅读
author-avatar
书友395154
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有