UCF Local Programming Contest 2016 J题(二分+bfs)
题目链接如下:
https://nanti.jisuanke.com/t/43321
思路:
显然我们要采用二分的方法来寻找答案,给定一个高度如果能确定在这个高度时是否可以安全到达终点,那我们就可以很快二分出最大可行的高度。在判断一个高度是否可行时,搜索从起点开始,在限制的高度下所有可以到达的坐标位置,检验是否经过终点即可。
/************************************************
┆ ┏┓ ┏┓ ┆
┆┏┛┻━━━┛┻┓ ┆
┆┃ ┃ ┆
┆┃ ━ ┃ ┆
┆┃ ┳┛ ┗┳ ┃ ┆
┆┃ ┃ ┆
┆┃ ┻ ┃ ┆
┆┗━┓ ┏━┛ ┆
┆ ┃ ┃ ┆
┆ ┃ ┗━━━┓ ┆
┆ ┃ AC代马 ┣┓┆
┆ ┃ ┏┛┆
┆ ┗┓┓┏━┳┓┏┛ ┆
┆ ┃┫┫ ┃┫┫ ┆
┆ ┗┻┛ ┗┻┛ ┆
************************************************ */
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <queue>
#include <string>
#include <sstream>
#include <cstdio>
#include <cstring>
#include<cctype>
#include <math.h>
#include <cmath>
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define lb long double
#define LINF 0x3f3f3f3f3f3f3f3f
#define ull unsigned long long
#define random(x) (rand()%x)
#define sgn(x) (fabs(x) < eps ? 0 : ((x) < 0 ? -1 : 1))
#define rep(i, a, b) for(int i=a;i<b;i++)
#define req(j, a, b) for(int j=a;j<b;j++)
#define mem(a, b) memset(a, b, sizeof(a))
#define PI 3.141592653589793
#define K 20 using namespace std;
typedef long long ll;
const int maxn = 1e5 + ;
const double eps =1e-;
const double pi = acos(-);
const ll mod = 1e9 + ;
const int hash_mod = ; inline int read()
{
int X=,w=; char ch=;
while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
while(isdigit(ch)) X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
} inline double dbread()
{
double X=,Y=1.0; int w=; char ch=;
while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
while(isdigit(ch)) X=X*+(ch^),ch=getchar();
ch=getchar();//读入小数点
while(isdigit(ch)) X+=(Y/=)*(ch^),ch=getchar();
return w?-X:X;
} inline void write(int x)
{
if(x<) putchar('-'),x=-x;
if(x>) write(x/);
putchar(x%+'');
} ll gcd(ll a,ll b)//辗转相除法(欧几里德算法)求最大公约数
{
return b ? gcd(b,a%b) : a;
}
ll lcm(ll a,ll b)
{
return a*b/gcd(a,b);//最小公倍数
}
ll q_pow(ll base, ll p)
{
ll result = ;
while(p > )
{
if(p&)
{//此处等价于if(power%2==1)
result = result * base % ;
}
p >>= ;//此处等价于power=power/2
base = (base * base) % ;
}
return result;
} const int N = ;
int fri[N]; void init()
{
for(int i = ; i <= N; i++)
fri[i] = i;
}
int find(int a) //查找根节点
{
int tem1 = a,tem2;
while(a != fri[a])
a = fri[a];
while(tem1 != a)
{
tem2 = fri[tem1];
fri[tem1] = a;
tem1 = tem2;
}
return a;
}
void Union(int a,int b)
{
int fri_a = find(a);
int fri_b = find(b);
if(fri_a != fri_b)
{
fri[fri_a] = fri_b;
}
return ;
} int eval(char c)
{
if(c==' ')
return ;
if(c=='\'')
return ;
return c - 'A' + ;
} double pointSegDist(double cx, double cy, double px1, double py1, double px2, double py2)
{
cx -= px1;
px2 -= px1;
cy -= py1;
py2 -= py1; double len = sqrt(px2*px2 + py2*py2);
double ux = px2 / (len * 1.0);
double uy = py2/ (len * 1.0);
uy = -uy;
double nx = cx * ux - cy * uy;
double ny = cx * uy + cy * ux; if(nx>= && nx <= len)
return abs(ny); if(nx > len)
nx -= len;
return sqrt(nx*nx + ny*ny);
} bool f(ll n)
{
for(ll i=;i<=n;i++)
{
if(n % (i * i) == )
return false;
}
return true;
} bool judgeStr(string s)
{
int len = s.size();
int i,j;
for(i=,j=len-;i<=len/;i++,j--)
{
if(s[i]!=s[j])
return ;
}
return ;
} ll f(ll n, ll d)
{
ll ans = ;
while(n > && n % d == )
{
n /= d;
ans++;
}
return ans;
} ll power(ll a, ll b)
{
long long ans = ;
for (int i=;i<b;i++)
ans *= a;
return ans;
} const int maxnn = 1e5+; int dx[]={, , -, }; int dy[]={, , , -}; int vis[][]; int w[][]; int r, c; int bfs(int h)
{
mem(vis, );
vis[][] = ;
queue<int> q;
//x,y,dis
q.push();
q.push();
q.push();
while(q.size() > )
{
int x = q.front();
q.pop();
int y = q.front();
q.pop();
int dis = q.front();
q.pop();
if(w[x][y] - dis >= h)
{
if(x == r- && y == c-)
{
return true;
}
for(int i=;i<;i++)
{
int a = x + dx[i];
int b = y + dy[i];
if(a >= && a < r && b >= && b < c && !vis[a][b])
{
vis[a][b] = ;
q.push(a);
q.push(b);
q.push(dis+);
}
}
}
}
return false;
} int main()
{
int t;
cin >> t;
while(t--)
{
cin >> r >> c;
for(int i=;i<r;i++)
{
for(int j=;j<c;j++)
{
cin >> w[i][j];
}
}
int left = ;
int right = INF;
while(left < right)
{
int mid = (left + right + ) / ;
if(bfs(mid))
{
left = mid;
} else
{
right = mid - ;
}
}
if(left > )
cout << left << endl;
else
cout << "impossible" << endl;
}
return ;
}
UCF Local Programming Contest 2016 J题(二分+bfs)的更多相关文章
- 2020.3.28-ICPC训练联盟周赛,选用试题:UCF Local Programming Contest 2016
A.Majestic 10 签到题. #include<iostream> #include<cstdio> #include<cstring> #include& ...
- 03.28,周六,12:00-17:00,ICPC训练联盟周赛,选用试题:UCF Local Programming Contest 2016正式赛。
A. Majestic 10 题意:三个数均大于10则输出"triple-double",如果两个数大于10则输出"double-double",如果一个大于1 ...
- 2016-2017 CT S03E05: Codeforces Trainings Season 3 Episode 5 (2016 Stanford Local Programming Contest, Extended) J
链接:http://codeforces.com/gym/101116 题意:给出n个点,要求一个矩形框将(n/2)+1个点框住,要面积最小 解法:先根据x轴选出i->j之间的点,中间的点(包括 ...
- 04.06 UCF Local Programming Contest 2017
A.Electric Bill 题意:简单计算题,超过1000部分额外算 1 #include<stdio.h> 2 int main(){ 3 int money1,money2; 4 ...
- 03.21 ICPC训练联盟周赛:UCF Local Programming Contest 2018正式赛
B Breaking Branches 题意:两个人比赛折枝,谁剩下最后1,无法折出整数即为输 思路:树枝长n,若是奇数,则Bob胜出,若是偶数,则Alice胜出,且需要输出1: 1 #include ...
- (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest(爽题)
layout: post title: (寒假开黑gym)2018 ACM-ICPC, Syrian Collegiate Programming Contest(爽题) author: " ...
- The 15th UESTC Programming Contest Preliminary J - Jermutat1on cdoj1567
地址:http://acm.uestc.edu.cn/#/problem/show/1567 题目: Jermutat1on Time Limit: 3000/1000MS (Java/Others) ...
- Gym 100952F&&2015 HIAST Collegiate Programming Contest F. Contestants Ranking【BFS+STL乱搞(map+vector)+优先队列】
F. Contestants Ranking time limit per test:1 second memory limit per test:24 megabytes input:standar ...
- 2016-2017 CT S03E05: Codeforces Trainings Season 3 Episode 5 (2016 Stanford Local Programming Contest, Extended) E
链接:http://codeforces.com/gym/101116 学弟写的,以后再补 #include <iostream> #include <algorithm> # ...
随机推荐
- TableViewComponent v2
Unity UGUI 自带的 ScrollView 控件不支持复用滚动内容,在数量大的情况下,界面容易卡顿 借鉴其他游戏控件,写了个可复用的滚动组件,扩展.优化了ScrollView TableVie ...
- 自研接口测试平台(Django2+Bootstrap3+Unittest)
自研接口测试平台(Django2+Bootstrap3+Unittest) HttpRuleTest是一款面向 HTTP 协议的通用测试框架,只需web端维护接口测试数据,即可实现自动化测试.监控.数 ...
- Laravel Study(使用 Laravel )
開始 伺服器及相關工具安裝自行建立,在伺服器跟目錄下 有兩種方式建立 Laravel 專案,這裡使用 composer 建立專案 使用 composer 要在 PHP 5.3.2 以上才能使用 com ...
- Linux 信号介绍
是内容受限时的一种异步通信机制 首先是用来通信的 是异步的 本质上是 int 型的数字编号,早期Unix系统只定义了32种信号,Ret hat7.2支持64种信号,编号0-63(SIGRTMIN=31 ...
- Jun
Contents 数据来源 代码演示 讨论 一.数据来源 为了节省时间,我直接用了官方所给的数据,分别是雄性和雌性小鼠的肝脏芯片数据 Female Data Male Data 二.代码演示 数据输入 ...
- QIs for Spread
玩了好几天,看了好多剧,所以这几天的进度稍微有点慢,另外,<一起同过窗>真香! 延展特性涉及解集覆盖的区域.一个具有良好分布的解集应该包含来自PF每个部分的解集,而不遗漏任何区域.然而,大 ...
- webpack环境配置2
1.webpack安装 Step 1: 首先安装Node.js, 在1中已经详细介绍了. Step2: 在Git或者cmd中输入下面这段代码, 通过全局先将webpack指令安装进电脑中npm ins ...
- Android状态机StateMachine使用举例及源码解析
Android frameworks源码StateMachine使用举例及源码解析 工作中有一同事说到Android状态机StateMachine.作为一名Android资深工程师,我居然没有听说过S ...
- 一位资深程序员大牛推荐的Java技术学习路线图
Web应用,最常见的研发语言是Java和PHP. 后端服务,最常见的研发语言是Java和C/C++. 大数据,最常见的研发语言是Java和Python. 可以说,Java是现阶段中国互联网公司中,覆盖 ...
- Spring事务Transactional和动态代理(三)-事务失效的场景
系列文章索引: Spring事务Transactional和动态代理(一)-JDK代理实现 Spring事务Transactional和动态代理(二)-cglib动态代理 Spring事务Transa ...