10324 Global Warming dfs + 二分

时间限制:1000MS  内存限制:65535K
提交次数:0 通过次数:0

题型: 编程题   语言: G++;GCC

Description

Global warming is a big problem, isn‘t it? It is reported that the ice of Antarctica is melting. It results that oceans are glowing
and more and more places are flooded. Now the city of CODE and the city of ACM are in front of the problem though no wather seperate
the two cities. The situation will change with the ice continue melting. It is reported that the oceans glow P cm per year. The mayors
of  the two cities want to know how many yeas there is before the two cities are seperated by water.
The map can be descriped as following

It is a M*N blocks
The city of CODE locates in the block of coordinate(1,1), the city of ACM locates in the block of coordinate(M,N). The altitude of
every blocks are given. It is guaranteed that the block of (1,1) and the block of (M,N) is higher than their neighbor block.
The following map shows the two cities weren‘t seperated by water.

The following map shows the two cities are eperated by water.

输入格式

The first line contains the two integer numbers N (1 <= N <= 500), M (1 <= M <= 500). Then N lines are following.
Each line contains
M integer numbers(seperated by a space). Each number no more than 1,000,000,000). The last line contains the integer number
P (1 <= P <= 1,000,000,000)

输出格式

The only line of the output contains the years mentioned above.

输入样例

3 3
9 5 7
4 6 8
8 3 9
1

输出样例

6

思路:以图中的最低海拔作为low,最高海拔作为high,二分一个值k,该值为能淹没部分区域并且把(1,1)和(n,m) 隔开的下界,那么p值即为 k/p 取上界。

其中用到dfs判断(1,1)和(n,m)两个点是否连通

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cmath>
 4 #include <algorithm>
 5 using namespace std ;
 6 typedef long long ll ;
 7 const int INF = 1 << 25 ;
 8 ll r[505][505] ;
 9 int vis[505][505] ;
10 int dir[][2] = {{-1, 0},{0, -1},{1, 0},{0, 1}} ;
11 ll n, m, mx, mi, p ;
12 void dfs(int i, int j)
13 {
14     vis[i][j] = 1 ;
15     for(int k = 0; k < 4; ++k)
16     {
17         int ti = i + dir[k][0] ;
18         int tj = j + dir[k][1] ;
19         if(ti < 1 || ti > n || tj < 1 || tj > m) continue ;
20         if(vis[ti][tj]) continue ;
21         dfs(ti, tj) ;
22     }
23 }
24 int go(int t)
25 {
26     memset(vis, 0, sizeof vis) ;
27     for(int i = 1; i <= n; ++i)
28         for(int j = 1; j <= m; ++j)
29             if(r[i][j] < t) vis[i][j] = 1 ;
30     dfs(1,1) ;
31     if(vis[n][m]) return 0 ;
32     else return 1 ;
33 }
34 int solve()
35 {
36     int low = mi, high = mx ;
37     while(low < high)//二分
38     {
39
40         int m = (low + high) >> 1 ;
41         //printf("[%d] ",m) ;
42         if(go(m)) high = m ;
43         else low = m + 1 ;
44     }
45     return low ;
46 }
47 int main()
48 {
49     #ifdef LOCAL
50     freopen("in.txt","r",stdin) ;
51     #endif
52     mi = INF ; mx = -INF ;
53     scanf("%d%d",&n,&m) ;
54     for(int i = 1; i <= n; ++i)
55     for(int j = 1; j <= m; ++j){
56         scanf("%lld",&r[i][j]) ;
57         if(r[i][j] > mx) mx = r[i][j] ;
58         else if(r[i][j] < mi) mi = r[i][j] ;
59     }
60    // printf("%d %d\n",mi,mx) ;
61     scanf("%lld",&p) ;
62     int ans ;
63     ans = solve() ;
64    // printf("%d\n",ans) ;
65     if(ans % p == 0) ans = ans / p ;
66     else ans = ans / p + 1 ;
67     printf("%d\n",ans) ;
68 }

时间: 2024-10-07 21:00:44

10324 Global Warming dfs + 二分的相关文章

【BZOJ4149】[AMPPZ2014]Global Warming 单调栈+RMQ+二分

[BZOJ4149][AMPPZ2014]Global Warming Description 给定一个序列a[1],a[2],...,a[n].请从中选出一段连续子序列,使得该区间最小值唯一.最大值也唯一. 输出选出的子序列的长度的最大值以及取到最大值时左端点的最小值. Input 第一行包含一个正整数n(1<=n<=500000),表示序列长度. 第二行包含n个正整数,依次表示a[1],a[2],...,a[n](-10^9<=a[i]<=10^9). Output 包含一行两

hihoCoder 1238 : Total Highway Distance(dfs + 二分)

题目连接 题意:给出n个城市,n-1条道路,求出两两路径的和. 思路:题意等价于求每天道路的使用次数,如下图所示 红色路径的使用度为以节点2为根节点的子树的节点数x * (n-x),此处为2 * 2 = 4.先按u<v的规则保存好道路,然后dfs一遍处理处每天道路的使用度,dfs过程中需要知道当前的边是哪条道路,此过程用二分查找,这中双变量的二分之前也没怎么写过. code: #include <iostream> #include <cstring> #include &l

hdu 5188 dfs+二分

get了很多新技能 当时想到了用dfs,但是排序用的是限制时间排序,一直没搞出来. 正解: 二分用时,dfs判断,为了顺利进行做题,需要按照做题开始时间排序 还可以用dp 题意: 作为史上最强的刷子之一,zhx常常参与各种比赛. 有一天,zhx去虐一场比赛.他觉得题太简单了. 这场比赛有n道题.他一眼就已经计算出他做第i道题要花ti的时间,做完后可以得到vi分. 因为他太强了,所以他被管理员盯上了.如果他在第li个单位时间前做完了第i道题,那么管理员就会认为他在作弊,然后把他的号封了. zhx不

ACdream 1726 A Math game (dfs+二分)

http://acdream.info/problem?pid=1726 官方题解:http://acdream.info/topic?tid=4246 求n个数里面能不能选一些数出来让它们的和等于k. 因为k很大,不能用背包,但是n很小,最大为40,所以拆成了2部分,之后最大为2^20次方<1050000;每次枚举前一半的和,然后用数组存储,然后得到一个总和减去后一半的差用二分查找. 1 #include<cstdio> 2 #include<cstring> 3 #inc

石油采集(求联通区域) 2018多校寒假集训 (dfs+二分匹配)

题目: 链接:https://www.nowcoder.com/acm/contest/76/A来源:牛客网 随着海上运输石油泄漏的问题,一个新的有利可图的行业正在诞生,那就是撇油行业.如今,在墨西哥湾漂浮的大量石油,吸引了许多商人的目光.这些商人们有一种特殊的飞机,可以一瓢略过整个海面20米乘10米这么大的长方形.(上下相邻或者左右相邻的格子,不能斜着来)当然,这要求一瓢撇过去的全部是油,如果一瓢里面有油有水的话,那就毫无意义了,资源完全无法利用.现在,商人想要知道,在这片区域中,他可以最多得

【纪中集训2019.08.20】【JZOJ6310】Global warming

题目链接 题意: 给出一个长度为$n$的序列$\{a_n\}$. 已知一个正整数$x$,你有一次机会指定区间$[l,r]$,令$\forall i\in [l,r],\;a_i=a_i+d\,(|d|\le x)$. 求最大化的最长上升子序列的长度. $1 \le n \le 2 \times 10^5 , \quad 1 \le a_i,x \le 10^9$且均为正整数. 分析: 可以很容易发现三个性质: 性质一:抬升$[l,r]$不优于抬升$[l,n]$,降低$[l,r]$不优于降低$[1

POJ 2942 - Knights of the Round Table(双连通图 Tarjan + 二分判定)

POJ 2942 - Knights of the Round Table(双连通图 Tarjan + 二分判定) ACM 题目地址: POJ 2942 - Knights of the Round Table 题意: 有N个骑士,给出某些骑士之间的仇恨关系,骑士们开会时会围坐在一个圆桌旁.一次会议能够顺利举行,要满足两个条件: 任意相互憎恨的两个骑士不能相邻 开会人数为大于2的奇数 若某个骑士任何会议都不能参加,那么就必须将他踢出,给出骑士之间的仇恨关系,问最少需要踢出多少个骑士? 分析: 把

弱校连萌 10.5

A.As Easy As Possible B.Be Friends C.Coprime Heaven D.Drawing Hell E.Easiest Game F.Fibonacci of Fibonacci G.Global Warming H.Hash Collision I.Increasing or Decreasing 询问[l,r] 区间 数位单调的数的个数 dp[pos][pre][zero] 然后 搜三次,搜单增的,单减的,不变的 1 #include <cstdio> 2

hdu 3329

The Flood Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 621    Accepted Submission(s): 254 Problem Description Global warming has us all thinking of rising oceans — well, maybe only those of u