土豆片二分之路进阶——刺杀大使(洛谷P1902)搜索+二分

经过两天半的练习以后,土豆片终于是勉强掌握了二分板子的做法,还没高兴起来他就遇到了真正的二分题,原来二分不会单独存在~~(二分答案+搜索)题目传送门


 题目内容:

d1eff655c3ee40d1909e80233c2c261d.png


 土豆片的思路详解:

初步分析:

首先,读完题目后有一个能指明思考方向的句子“整个部队的伤害值最小”而整个部队的伤害值为队员中受到伤害的最大值,所以本题就是要求最大值的最小值,符合二分答案,所以是要用二分答案来寻找。

如何二分以及如何判定:

既然已经知道了是要用二分答案,我们就可以对答案mid进行二分,mid代表一个界限,如果当前的位置伤害比mid小就代表可以走,反之就不能走,因为每一个门都是相连,只要有一条路可以走那么整个队伍就可以通过这条道路到达,所以我们只需每次判断是否能从第一行走到最后一行即可。

如何找到道路(搜索):

有了思路以后我们就该开始想如何实现。关于找道路的方法,暴力,肯定是最简单易懂的,但是数据强度会狠狠给你wa一发让你清醒清醒(数据要是水了当土豆片没说),数据强度可没有椒盐粉那么温柔,所以要用到一些高大上的方法(反正对土豆片来说挺高大上)——深搜或者广搜来找到通路。并且由题意可知只要找到道路就可以直接退出dfs以减少时间空间。(别问为啥不用bfs,问就是不会!!!)

代码实现:

#include<bits/stdc++.h>
#define int long long
using namespace std;

int n,m,ans,flag,maxn,l,r,mid;
int a[1001][1001],vi[1001][1001];
int dx[5]={0,1,-1,0};
int dy[5]={1,0,0,-1};		//基本搜索dfs 

void dfs(int x,int y){
  if(x==n){
    flag=1;
    return;
  }
  for(int i=0;i<4;i++){
    int xx=x+dx[i];
    int yy=y+dy[i];
    if(xx>0&&yy>0&&xx<=n&&yy<=m){
      if(!vi[xx][yy]&&a[xx][yy]<=mid){  //不超过边界且伤害值在mid范围内 
        vi[xx][yy]=1;		
        dfs(xx,yy);
        if(flag){
			break;
		}
      }
    }
  }
}

signed main(){
  cin>>n>>m;
  for(int i=1;i<=n;i++){ 
    for(int j=1;j<=m;j++){
      cin>>a[i][j];
      maxn=max(maxn,a[i][j]);	//二分的最值 
    }
  } 
  l=0;
  r=maxn;
  while(l<=r){		//二分答案伤害 
    mid=(l+r)/2;
    flag=0;
    memset(vi,0,sizeof vi);
    dfs(1,1);		//进行搜索寻找道路 
    if(flag){
		ans=mid;
		r=mid-1;
	}
    else{
		l=mid+1;
	}
  }
  cout<<ans;
  return 0;
}

注意!!!记得清空标记数组! 记得清空标记数组!记得清空标记数组!(土豆片因为这wa了四发!!!)

总结:

1.二分的大门刚刚打开,二分永远不会单独出现,是一个工具(大概?)积极联想

2.关注边界以及check的思路

3.不要wa了一发才想到二分,以后学的东西越来越多要注重综合运用

 

 

 

Hitters数据集是一个关于棒球击球手的数据集,包含了19个变量。这些变量的含义如下: 1. 季节(Season):指示球员打击的年份季节,取值为1986或1987。 2. 球龄(Years):表示球员在大联盟的经验年数。 3. 球员名字(Name):击球手的名字。 4. 球队(Team):球员所属的球队。 5. 赛区(League):球队所属的赛区,分为美联和国联。 6. 外野手守位(Division):球员守备的外野位置,包括中外野手(CF)、右外野手(RF)和左外野手(LF)。 7. 打击总数(At-bats):球员在一个赛季内的打击次数。 8. 安打数(Hits):球员在一个赛季内累计的安打数。 9. 全垒打数(Home-runs):球员在一个赛季内击出的全垒打的数量。 10. 打点(Runs_batted_in):球员在一个赛季内累计的打点(即使其他跑者得分)。 11. 打席(Walks):球员在一个赛季内的打席数。 12. 投手被三振(Strike-outs):球员在一个赛季内被投手三振的次数。 13. 投打受死(Stolen-bases):球员在一个赛季内盗垒成功的次数。 14. 被刺杀(Caught-stealing):球员在一个赛季内被刺杀盗垒的次数。 15. 左权(Put-outs):球员在一个赛季内守备成功的标判次数。 16. 放手安守候(Assists):球员在一个赛季内助攻次数。 17. 错误(Errors):球员在一个赛季内犯的失误次数。 18. 蔬果年龄(Salary):球员在一个赛季内的工资水平。 19. 合同年限(League):球员合同的年限。 这些变量可以用来分析球员的打击能力、盗垒和守备表现以及与球队签订合同的相关因素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bluechips·zhao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值