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> # ...
随机推荐
- hihoCoder 1128 二分查找
Description Input and Output Codes 描述#1128 : 二分·二分查找 Description Nettle最近在玩<艦これ>,因此Nettle收集了很多 ...
- AAAI |如何保证人工智能系统的准确性?
|如何保证人工智能系统的准确性?" title="AAAI |如何保证人工智能系统的准确性?"> 注:本文译自AI is getting smarter; ...
- Zookeeper的核心概念以及java客户端使用
一.Zookeeper的核心概念 分布式配置中心(存储):disconf(zk).diamond(mysql+http) 1)znode ZooKeeper操作和维护的是一个个数据节点,称为 znod ...
- Asp.net Core MVC(四)
上一篇说的是asp.net mvc核心UseMvc的过程,末尾想捋一下asp.net核心的路由流转过程,现在看来还是要准备下一个代码,熟悉了代码,那么整个流转过程就通了〜 不多说,今儿先看下,Rout ...
- CSS+JS相应式导航菜单
响应式导航菜单 响应式导航菜单就是当网页在其他不同视口的样式,不同的设备需要不同的样式 需要掌握的知识 - 掌握媒体查询,如果你不是很懂那就看我写的CSS响应式布局 掌握CSS重的display:no ...
- 关于 InnoDB 锁的超全总结
有点全的 InnoDB 锁 几个月之前,开始深入学习 MySQL .说起数据库,并发控制是其中很重要的一部分.于是,就这样开起了 MySQL 锁的学习,随着学习的深入,发现想要更好的理解锁,需要了解 ...
- .Net Core WebApi在Linux上启动和关闭
测试机器:阿里云云主机1核2g 安装环境:centos-7 服务器:Nginx 1.17.1 测试默认已启动 已安装配置:.Net Core 3.1 测试默认安装 连接配置:x-ftp,x-shell ...
- MapReduce 简单数据统计
1. 准备数据源 摘录了一片散文,保存格式为utf-8 2. 准备环境 2.1 搭建伪分布式环境 https://www.cnblogs.com/cjq10029/p/12336446.html 上传 ...
- OpenWrt tcpdump 抓包
路由器用的是 网件的 4300 刷的是石像鬼双固件 1, 安装支持库opkg updateopkg install libpcapopkg install tcpdump 2, 设置条件开始捕获tcp ...
- python 异步请求
这是循环请求10次页面.总时间大概是10秒左右,如果是普通的循环请求10次页面而不添加异步的话,时间大概在30秒以上,当然这个数据可能有误,因为有网速的问题存在,但大体的效果应该是不变的. impor ...