【牛客 - 318F】关于我转生变成史莱姆这档事(二分,搜索)

题干:

有一天,利姆鲁在这个世界最重要的人静被魔王带走,并将其困在一个n*n的迷宫内的某一处,迷宫的每个格子都可能有一只魔物,魔物的攻击力为a[i][j],因而利姆鲁只有当攻击力大于等于a[i][j]才能通过这个方格,否则就只能绕道(只能朝上下左右四个方向)而行。
    为了拯救静,利姆鲁决定勇闯迷宫!

    现在利姆鲁站在(sx,sy)处,静在(ex,ey)处,为了保证自己能够成功拯救静,利姆鲁在初始时靠捕食者将自己的攻击力提升到x后才出发,但是由于时间紧急(利姆鲁不想和静分开太久),使用捕食者需要花费时间,所以利姆鲁想知道能够成功救出静的最小的x(默认初始位置的魔物对利姆鲁无攻击,即此位置对其而言是安全位置)是多少。

输入描述:

第一行为一个正整数t(1<=t<=20),表示测试数据的数量。
每组数据第一行为一个正整数n(1<=n<=500),表示迷宫大小。
第2行至第n+1行,每行有n个整数,相邻两个数用空格隔开。第i行第j列的数a[i][j]表示这一个方格中的魔物的攻击力大小为a[i][j](0<=a[i][j]<=1e5)。
第n+2行为四个正整数sx,sy,ex,ey(相邻两个数用空格隔开),分别表示利姆鲁的坐标和静的坐标。(1<=sx,sy,ex,ey<=n)。

输出描述:

利姆鲁初始的攻击力的最小值x(大于等于0的整数)。

示例1

输入

复制

1
5
1 2 3 4 5
1 2 3 4 7
3 4 2 1 3
7 8 1 2 3
3 1 2 3 6
1 1 5 5

输出

复制

6

说明

其中一条使得初始攻击力最小的路线为(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(4,3)->(5,3)->(5,4)->(5,5),此时初始攻击力只要6,因而答案是6。

解题报告:

    二分一下需要提升的攻击力,然后搜索check是否可以满足就可以了。

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e5 + 5;
int n;
int sx,sy,ex,ey;
int mid;
bool flag;
int a[555][555];
bool vis[555][555];
int nx[4] = {0,1,0,-1};
int ny[4] = {1,0,-1,0};
bool ok(int x,int y) {if(x>=1 && x<=n && y>=1 && y<=n) return 1;else return 0;
}
void dfs(int x,int y) {if(x == ex && y == ey) {flag = 1;return;}for(int k = 0; k<4; k++) {int tx = x + nx[k];int ty = y + ny[k];if(ok(tx,ty) == 0) continue;if(a[tx][ty] > mid) continue;if(vis[tx][ty]) continue;vis[tx][ty] = 1;dfs(tx,ty);if(flag) return;}}
int main()
{int t;cin>>t;while(t--) {scanf("%d",&n);int maxx = 0;for(int i = 1; i<=n; i++) {for(int j = 1; j<=n; j++) {scanf("%d",&a[i][j]);maxx = max(maxx,a[i][j]);}}scanf("%d%d%d%d",&sx,&sy,&ex,&ey);int l = a[ex][ey],r = maxx;mid = (l+r)>>1;int ans = 0;/如果不加=0? while(l<=r) {mid = (l+r)>>1;memset(vis,0,sizeof vis);vis[sx][sy] = 1;flag = 0;dfs(sx,sy);if(flag) r = mid-1, ans = mid;else l = mid+1;}printf("%d\n",ans);}return 0 ;}

不加=0也可以AC,,说明数据保证有解了。

这题也可以用类似并查集的东西,就是先把二维坐标变成线性的,然后并查集:把值为a[i][j]的push_back到对应的vector中,然后从小到大枚举答案一直到起点和终点被并到同一个集合中,结束程序。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
#define CASET int ___T; scanf("%d", &___T); for(int cs=1;cs<=___T;cs++)
#define REP(I, N) for (int I = 0; I < (N); ++I)
using namespace std;
const int SIZE = 1e5+10;
typedef pair<int,int> PII;
typedef vector<int> VI;
typedef vector<ll> VL;
typedef vector<PII> VPII;
struct Union_Find {int d[250001],num[250001];void init(int n) {REP(i,n)d[i]=i,num[i]=1;}int find(int x) {return (x!=d[x])?(d[x]=find(d[x])):x;}bool is_root(int x) {return d[x]==x;}bool uu(int x,int y) {x=find(x);y=find(y);if(x==y)return 0;if(num[x]>num[y])swap(x,y);num[y]+=num[x];d[x]=y;return 1;}
} U;
VPII pp[SIZE];
int a[555][555];
int dx[4]= {1,0,-1,0};
int dy[4]= {0,1,0,-1};
int main() {CASET {int n;cin>>n;U.init(n*n);REP(i,SIZE)pp[i].clear();REP(i,n)REP(j,n) {scanf("%d",&a[i][j]);pp[a[i][j]].pb({i,j});}PII st,ed;scanf("%d%d",&st.fi,&st.se);scanf("%d%d",&ed.fi,&ed.se);st.fi--;st.se--;ed.fi--;ed.se--;a[st.fi][st.se]=0;pp[0].pb(st);REP(i,SIZE) {for(auto p:pp[i]) {REP(j,4) {int nx=p.fi+dx[j];int ny=p.se+dy[j];if(nx<0||ny<0||nx>=n||ny>=n)continue;if(a[nx][ny]<=i)U.uu(p.fi*n+p.se,nx*n+ny);}}if(U.find(st.fi*n+st.se)==U.find(ed.fi*n+ed.se)) {printf("%d\n",i);break;}}}return 0;
}

还有一种方法:

优先队列维护权值小根堆,然后bfs整张地图一次,同时权值递增的同时维护最大值,也就是如果一条路是1->3->2,那整2那个地方的权值也是3。大概是这个意思。

#include<bits/stdc++.h>
using namespace std;
const int N=505;
struct node{int x,y,g;bool friend operator<(node c,node d){return c.g>d.g;}
}no,ne;
int a[N][N],n,sx,sy,ex,ey,m[4][2]={1,0,-1,0,0,1,0,-1};
bool vis[N][N];
void bfs(){memset(vis,0,sizeof(vis));priority_queue<node>q;no.x=sx;no.y=sy;no.g=0;vis[no.x][no.y]=1;q.push(no);while(!q.empty()){no=q.top();q.pop();if(no.x==ex&&no.y==ey){printf("%d\n",no.g);return;}for(int i=0;i<4;i++){ne.x=no.x+m[i][0];ne.y=no.y+m[i][1];if(ne.x<1||ne.x>n||ne.y<1||ne.y>n||vis[ne.x][ne.y])continue;ne.g=max(no.g,a[ne.x][ne.y]);vis[ne.x][ne.y]=1;q.push(ne);}}
}
int main(){int T;scanf("%d",&T);while(T--){scanf("%d",&n);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%d",&a[i][j]);scanf("%d%d%d%d",&sx,&sy,&ex,&ey);bfs();}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440814.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java获取xlsx某列数据_Java读取Excel指定列的数据详细教程和注意事项

本文使用jxl.jar工具类库实现读取Excel中指定列的数据。jxl.jar是通过java操作excel表格的工具类库&#xff0c;是由java语言开发而成的。这套API是纯Java的&#xff0c;并不依赖Windows系统&#xff0c;即使运行在Linux下&#xff0c;它同样能够正确的处理Excel文件。支持Exce…

【CodeForces - 988C 】Equal Sums (思维,STLmap,STLset,tricks)

题干&#xff1a; You are given kk sequences of integers. The length of the ii-th sequence equals to nini. You have to choose exactly two sequences ii and jj (i≠ji≠j) such that you can remove exactly one element in each of them in such a way that the su…

java quartz 数据库_SpringBoot+Quartz+数据库存储

Spring整合Quartza、quartz调度框架是有内置表的进入quartz的官网http://www.quartz-scheduler.org/&#xff0c;点击Downloads&#xff0c;下载后在目录\docs\dbTables下有常用数据库创建quartz表的脚本&#xff0c;例如&#xff1a;“tables_mysql.sql”table_mysql.sqltable…

【CodeForces - 1062C】Banh-mi (贪心,数学,找规律,快速幂)

题干&#xff1a; JATC loves Banh-mi (a Vietnamese food). His affection for Banh-mi is so much that he always has it for breakfast. This morning, as usual, he buys a Banh-mi and decides to enjoy it in a special way. First, he splits the Banh-mi into nn pa…

【牛客 - 练习】约数个数的和(数论,数学)

题干&#xff1a; 给个n&#xff0c;求1到n的所有数的约数个数的和~ 输入描述: 第一行一个正整数n 输出描述: 输出一个整数&#xff0c;表示答案 示例1 输入 复制 3 输出 复制 5 说明 样例解释&#xff1a; 1有1个约数1 2有2个约数1,2 3有2个约数1,3 备注: n…

mysql json 创建索引_MySQL · 最佳实践 · 如何索引JSON字段

概述MySQL从5.7.8起开始支持JSON字段&#xff0c;这极大的丰富了MySQL的数据类型。也方便了广大开发人员。但MySQL并没有提供对JSON对象中的字段进行索引的功能&#xff0c;至少没有直接对其字段进行索引的方法。本文将介绍利用MySQL 5.7中的虚拟字段的功能来对JSON对象中的字段…

mysql链路跟踪工具_EasySwoole利用链路追踪组件制作甩锅工具

前言最近前端老是反馈API调用异常&#xff0c;说请求成功但是没有数据返回&#xff01;我写的代码怎么可能有bug&#xff0c;肯定是前端调用的方式不对&#xff01;经过一番套鼓&#xff0c;直接把请求参数和响应内容打印到控制台&#xff0c;果然不出我所料&#xff0c;请求缺…

【CCFCSP- 201312-4】有趣的数(线性dp)

题干&#xff1a; 试题编号&#xff1a;201312-4试题名称&#xff1a;有趣的数时间限制&#xff1a;1.0s内存限制&#xff1a;256.0MB问题描述&#xff1a; 问题描述   我们把一个数称为有趣的&#xff0c;当且仅当&#xff1a;   1. 它的数字只包含0, 1, 2, 3&#xff0c…

java selector 源码_Java NIO核心组件-Selector和Channel

昨天我们介绍了一下SelectorProvider和IO multiplexing.特别是IO multiplexing中的epoll系统调用,是Linux版本的Java的NIO的核心实现.那今天我们就来介绍一下, Java NIO中的核心组件, Selector和Channel.这两个组件,对于熟悉Java OIO,而不熟悉Java NIO的朋友来说,理解其作用是极…

【HDU - 1542】Atlantis (线段树,扫描线)

题干&#xff1a; There are several ancient Greek texts that contain descriptions of the fabled island Atlantis. Some of these texts even include maps of parts of the island. But unfortunately, these maps describe different regions of Atlantis. Your friend…

python 底层原理processpoolexecutor_python 多进程并行编程 ProcessPoolExecutor的实现

使用 ProcessPoolExecutorfrom concurrent.futures import ProcessPoolExecutor, as_completedimport random斐波那契数列当 n 大于 30 时抛出异常def fib(n):if n > 30:raise Exception(can not > 30, now %s % n)if n < 2:return 1return fib(n-1) fib(n-2)准备数组…

【HDU - 5700】【51nod - 1672】 区间交(贪心,STLset 或线段树第k大)

题干&#xff1a; 小A有一个含有n个非负整数的数列与m个区间&#xff0c;每个区间可以表示为li,ri。 它想选择其中k个区间&#xff0c; 使得这些区间的交的那些位置所对应的数的和最大。&#xff08;是指k个区间共同的交&#xff0c;即每个区间都包含这一段&#xff0c;具体可…

python 爬虫 博客园_Python爬虫爬取博客园作业

分析一下他们的代码&#xff0c;我在浏览器中对应位置右键&#xff0c;然后点击检查元素&#xff0c;可以找到对应部分的代码。但是&#xff0c;直接查看当前网页的源码发现&#xff0c;里面并没有对应的代码。我猜测这里是根据服务器上的数据动态生成的这部分代码&#xff0c;…

【洛谷 - P1507 】NASA的食物计划(二维费用背包,dp)

题干&#xff1a; 题目背景 NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安全技术问题一直大伤脑筋,因此在各方压力下终止了航天飞机的历史,但是此类事情会不会在以后发生&#xff0c;谁也无法保证,在遇到这类航天问题时,解决方法也许只能让航天员出仓维修,但是多次的维修…

java 与 xml_xml与java对象转换

public static void main(String[] args) {//java bean 转 xmlDept d new Dept();List staffs new ArrayList<>();Staff s1 new Staff("wuyun", 20);Staff s2 new Staff("lilei", 22);staffs.add(s1);staffs.add(s2);d.setDeptName("开放平…

【蓝桥杯官网试题 - 算法训练 】P0502(乱搞,tricks)

题干&#xff1a; 编写一个程序&#xff0c;读入一组整数&#xff0c;这组整数是按照从小到大的顺序排列的&#xff0c;它们的个数N也是由用户输入的&#xff0c;最多不会超过20。然后程序将对这个数组进行统计&#xff0c;把出现次数最多的那个数组元素值打印出来。如果有两个…

python循环中的else_python 循环中else的简单示例

导读热词对python这个高级语言感兴趣的小伙伴&#xff0c;下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧&#xff01;众多语言中都有if else这对条件选择组合&#xff0c;但是在python中还有更多else使用的地方&#xff0c;比如说循环for&#xff0c;或者while都可以和els…

【蓝桥杯官网试题 -算法训练】素因子去重(数学,数论,因子约数)

题干&#xff1a; 问题描述 给定一个正整数n&#xff0c;求一个正整数p&#xff0c;满足p仅包含n的所有素因子&#xff0c;且每个素因子的次数不大于1 输入格式 一个整数&#xff0c;表示n 输出格式 输出一行&#xff0c;包含一个整数p。 样例输入 1000 样例输出 10 数…

【蓝桥杯官网试题 - 算法提高】 贪吃的大嘴 (多重背包转0-1背包,dp)

题干&#xff1a; 问题描述 有一只特别贪吃的大嘴,她很喜欢吃一种小蛋糕,而每一个小蛋糕有一个美味度,而大嘴是很傲娇的,一定要吃美味度和刚好为m的小蛋糕,而且大嘴还特别懒,她希望通过吃数量最少的小蛋糕达到这个目的.所以她希望你能设计一个程序帮她决定要吃哪些小蛋糕. 输…

java applet socket_Java swing applet中使用的套接字

小编典典基于此示例&#xff0c;这是一个使用Swing的简单网络客户端/服务器对。请注意与正确同步有关的一些问题&#xff1a;GUI本身是使用事件分配线程构建的invokeLater()。此外&#xff0c;代码还依赖的线程安全性append()。最后&#xff0c;它结合了文章Text Area Scrollin…