hiho week 38 P1 : 二分·二分答案

P1 : 二分·二分答案

Time Limit:10000ms

Case Time Limit:1000ms

Memory Limit:256MB

描述

在上一回和上上回里我们知道Nettle在玩《艦これ》,Nettle在整理好舰队之后终于准备出海捞船和敌军交战了。
在这个游戏里面,海域是N个战略点(编号1..N)组成,如下图所示

其中红色的点表示有敌人驻扎,猫头像的的点表示该地图敌军主力舰队(boss)的驻扎点,虚线表示各个战略点之间的航线(无向边)
在游戏中要从一个战略点到相邻战略点需要满足一定的条件,即需要舰队的索敌值大于等于这两点之间航线的索敌值需求。
由于提高索敌值需要将攻击机、轰炸机换成侦察机,舰队索敌值越高,也就意味着舰队的战力越低。
另外在每一个战略点会发生一次战斗,需要消耗1/K的燃料和子弹。必须在燃料和子弹未用完的情况下进入boss点才能与boss进行战斗,所以舰队最多只能走过K条航路。
现在Nettle想要以最高的战力来进攻boss点,所以他希望能够找出一条从起始点(编号为1的点)到boss点的航路,使得舰队需要达到的索敌值最低,并且有剩余的燃料和子弹。

特别说明:两个战略点之间可能不止一条航线,两个相邻战略点之间可能不止一条航线。保证至少存在一条路径能在燃料子弹用完前到达boss点。

提示:你在找什么?

输入

第1行:4个整数N,M,K,T。N表示战略点数量,M表示航线数量,K表示最多能经过的航路,T表示boss点编号, 1≤N,K≤10,000, N≤M≤100,000
第2..M+1行:3个整数u,v,w,表示战略点u,v之间存在航路,w表示该航路需求的索敌值,1≤w≤1,000,000。

输出

第1行:一个整数,表示舰队需要的最小索敌值。

Sample Input
5 6 2 5
1 2 3
1 3 2
1 4 4
2 5 2
3 5 5
4 5 3
Sample Output
3

解题:二分。。。

 1 #include <iostream>
 2 #include <queue>
 3 #include <cstring>
 4 using namespace std;
 5 const int maxn = 20010;
 6 struct arc{
 7     int to,cost,next;
 8     arc(int x = 0,int y = 0,int z = -1){
 9         to = x;
10         cost = y;
11         next = z;
12     }
13 }e[maxn*50];
14 int head[maxn],d[maxn],tot,N,M,K,T;
15 void add(int u,int v,int cost){
16     e[tot] = arc(v,cost,head[u]);
17     head[u] = tot++;
18     e[tot] = arc(u,cost,head[v]);
19     head[v] = tot++;
20 }
21 queue<int>q;
22 bool bfs(int value){
23     while(!q.empty()) q.pop();
24     q.push(1);
25     memset(d,-1,sizeof(d));
26     d[1] = 0;
27     while(!q.empty()){
28         int u = q.front();
29         q.pop();
30         for(int i = head[u]; ~i; i = e[i].next){
31             if(d[e[i].to] == -1 && value >= e[i].cost && d[u] + 1 <= K){
32                 d[e[i].to] = d[u] + 1;
33                 q.push(e[i].to);
34             }
35         }
36     }
37     if(d[T] == -1 || d[T] > K) return false;
38     return true;
39 }
40 int main(){
41     int u,v,w;
42     while(~scanf("%d %d %d %d",&N,&M,&K,&T)){
43         memset(head,-1,sizeof(head));
44         for(int i = tot = 0; i < M; ++i){
45             scanf("%d %d %d",&u,&v,&w);
46             add(u,v,w);
47         }
48         int low = 1,high = 1000000,ans = 0;
49         while(low <= high){
50             int mid = (low + high)>>1;
51             if(bfs(mid)) ans = mid,high = mid - 1;
52             else low = mid + 1;
53         }
54         printf("%d\n",ans);
55     }
56     return 0;
57 }

时间: 2024-12-28 10:17:24

hiho week 38 P1 : 二分·二分答案的相关文章

hiho week 37 P1 : 二分&#183;二分查找之k小数

P1 : 二分·二分查找之k小数 Time Limit:10000ms Case Time Limit:1000ms Memory Limit:256MB 描述 在上一回里我们知道Nettle在玩<艦これ>,Nettle的镇守府有很多船位,但船位再多也是有限的.Nettle通过捞船又出了一艘稀有的 船,但是已有的N(1≤N≤1,000,000)个船位都已经有船了.所以Nettle不得不把其中一艘船拆掉来让位给新的船.Nettle思考了很久, 决定随机选择一个k,然后拆掉稀有度第k小的船. 已知

Brownie Slicing(二分枚举答案)

描述 Bessie has baked a rectangular brownie that can be thought of as an RxC grid (1 <= R <= 500; 1 <= C <= 500) of little brownie squares.The square at row i, column j contains N_ij (0 <= N_ij <= 4,000) chocolate chips.Bessie wants to par

hiho#1133 : 二分&#183;二分查找之k小数

#1133 : 二分·二分查找之k小数 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回里我们知道Nettle在玩<艦これ>,Nettle的镇守府有很多船位,但船位再多也是有限的.Nettle通过捞船又出了一艘稀有的船,但是已有的N(1≤N≤1,000,000)个船位都已经有船了.所以Nettle不得不把其中一艘船拆掉来让位给新的船.Nettle思考了很久,决定随机选择一个k,然后拆掉稀有度第k小的船. 已知每一艘船都有自己的稀有度,Nettle现在把所有

#1128 : 二分&#183;二分查找 ( 两种方法 先排序在二分O(nlogN) + 直接二分+快排思想O(2N) )

#1128 : 二分·二分查找 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Nettle最近在玩<艦これ>,因此Nettle收集了很多很多的船(这里我们假设Nettle氪了很多金,开了无数个船位).去除掉重复的船之后,还剩下N(1≤N≤1,000,000)种不同的船.每一艘船有一个稀有值,任意两艘船的稀有值都不相同,稀有值越小的船越稀有,价值也就越高. Nettle现在通过大建又造出了一艘船,他想知道这艘船是不是重复的.如果是重复的,那么这艘船在Nettle所

ACM学习历程—Hihocoder 1139 二分&#183;二分答案(bfs)

http://hihocoder.com/problemset/problem/1139 这题提示上写的是二分,但是感觉不二分应该也可以,至少题目是AC的... 二分的思想就是二分答案的值,看能不能在k步内,得到这个答案值,可以采用bfs来判定. 不二分的话,就是需要一个dis[]数组来保存在前k步内,每个点的最小索敌值,因为bfs在往后的过程中step是越来越大的,所以前面能达到更小的,显然不会重复再跑大的,然后bfs的过程中更新即可.类似于spfa,但是没有对队列去重. 代码: #inclu

用二分枚举答案题

以二分算法枚举答案的方法非常高效,枚举所需的时间复杂度只需O(logN) 设x为答案,check(x)只有真假两种取值. 能够使用二分枚举算法的条件: 存在一个X,当x小于X时和x大于X时,check(x)真假值不一样. 二分枚举即能够找出真假之间的边界,这个就是所求在满足题意下的最值了. 如果x是浮点数,那么边界的取值注意精度即可. const double eps=1e-7; while(l+eps<r) { mid=(l+r)/2; if(check(mid)) l=mid; else r

POJ 2112—— Optimal Milking——————【多重匹配、二分枚举答案、floyd预处理】

Optimal Milking Time Limit:2000MS     Memory Limit:30000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2112 Description FJ has moved his K (1 <= K <= 30) milking machines out into the cow pastures among the C (1 <= C <= 20

hihoCoder#1139 二分&#183;二分答案

原题地址 挺简单一道题,结果因为一时傻逼写错一个小地方,导致WA成狗了_(:з」∠)_ 代码: 1 #include <iostream> 2 #include <cstring> 3 #include <queue> 4 5 using namespace std; 6 7 #define MAX_V 10008 8 #define MAX_E 200008 9 10 int N, M, K, T; 11 int f[MAX_V]; 12 bool v[MAX_V];

【hihoCoder 1139】 二分&#183;二分答案

时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上一回和上上回里我们知道Nettle在玩<艦これ>,Nettle在整理好舰队之后终于准备出海捞船和敌军交战了. 在这个游戏里面,海域是N个战略点(编号1..N)组成,如下图所示 其中红色的点表示有敌人驻扎,猫头像的的点表示该地图敌军主力舰队(boss)的驻扎点,虚线表示各个战略点之间的航线(无向边). 在游戏中要从一个战略点到相邻战略点需要满足一定的条件,即需要舰队的索敌值大于等于这两点之间航线的索敌值需求. 由于