首页 > 其他分享 >题解 P4955 【[USACO14JAN]Cross Country Skiing S】

题解 P4955 【[USACO14JAN]Cross Country Skiing S】

时间:2023-07-20 17:25:21浏览次数:46  
标签:return int 题解 Cross mid Skiing 510 check

posted on 2021-02-27 10:04:32 | under 题解 | source

这道题其实没有绿这么难,只需要二分+搜索就行了。

  1. 读入。注意尽量不要用 scanf 读入 bool,这好像是 UB,可以用一个变量 \(x\) 存输入的数,然后直接类型转换。
  2. 二分。套模版就行了,等一下我们再写 \(\operatorname{check}()\) 函数。
  3. 搜索。直接 dfs 爆搜,注意我们只需要标记这个点能不能到,不用回溯。
  4. \(\operatorname{check}()\)。我们先清空数组,然后随便挑一个点开始暴搜(实测 \(\operatorname{dfs}(1,1)\) 能过)。然后两重 for 循环暴力检查,如果发现一个关键点没被标记,说明这个解不合法,return 0。如果到最后还没有 return 0,说明这个解合法,return 1
#include <cstdio>
#include <cstring>
using namespace std;
const int dx[]={0,-1,0,0,1},//四方向打表
          dy[]={0,0,-1,1,0};
int n,m,a[510][510];
bool vis[510][510],key[510][510];//vis标记,key关键点
int abs(int a){//把一些常用函数封一下
    return a<0?-a:a;
}
bool checkpoint(int x,int y){
    return 1<=x&&x<=n&&1<=y&&y<=m;
}
void dfs(int x,int y,int nowans){//搜索
    for(int i=1;i<=4;i++){
        int tmpx=x+dx[i],tmpy=y+dy[i];
        if(checkpoint(tmpx,tmpy)&&!vis[tmpx][tmpy]&&\
           abs(a[x][y]-a[tmpx][tmpy])<=nowans){//这里\可以使上下两行无缝衔接,可以用这个减少一行的长度
            vis[tmpx][tmpy]=1;
            dfs(tmpx,tmpy,nowans);
          	//不用回溯
        }
    }
}
bool check(int nowans){//暴力check
    memset(vis,0,sizeof vis);
    vis[1][1]=1;//注意标记起点
    dfs(1,1,nowans);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            if(key[i][j]&&!vis[i][j]) return 0;
    return 1;
}
int binary(){//套模版
    int l=0,r=1e9+10;
    while(l<=r){
        int mid=l+r>>1;//1e9+1e9=2e9不爆int
        if(check(mid)) r=mid-1;
        else l=mid+1;
    }
    return r+1;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            scanf("%d",&a[i][j]);
    for(int i=1,x;i<=n;i++)
        for(int j=1;j<=m;j++)
            scanf("%d",&x),key[i][j]=x;//防UB
    printf("%d",binary());
    return 0;
}

标签:return,int,题解,Cross,mid,Skiing,510,check
From: https://www.cnblogs.com/caijianhong/p/solution-p4955.html

相关文章

  • CF1152F2 Neko Rules the Catniverse (Large Version) 题解
    发现挨位考虑填哪个不太现实,考虑值域。令\(dp_{i,j,st}\)表示考虑到\(i\),此时序列长度为\(j\),\(i-m\)到\(i-1\)填空状态为\(st\)的方案数,考虑选/不选数即可:\(dp_{i,j,st}\times(\text{popcount}(st)+1)\todp_{i+1,j+1,(2st+1)\&2^m},dp_{i+1,j,(2st)\&2^m}\)乘上那......
  • 题解 //「BZOJ2406」矩阵
    赛时公告现在呢?:现在有弹窗了吗「2023-07-1916:45:07」此时无声胜有声。F.「BZOJ2406」矩阵http://222.180.160.110:1024/contest/3825/problem/7这是头一次见识到把矩阵和网络流结合在一起的题目。不过这种处理方式也是我们在学习二分图时的常客了:把行和列连边表示某一元......
  • 【题解】Luogu[P3360] 偷天换日
    solution开题显然是个树形dp,只不过在树形dp上又增加了背包问题。我们不妨将每个走廊看成一个点,把交叉口看成边(当然也可以把交叉口看成点,不过写起来麻烦一些),于是就转化为了一棵二叉树。我们设\(f_{i,j}\)表示以\(i\)为根的子树内,花费了不超过\(j\)时间,能拿到的最大价值......
  • Frog 3 题解
    Frog3题目大意题意都这么明确了还要这个干什么。存在\(n\)个点,每个点有一个属性\(h_i\),\(h_i\)单增,从点\(i\)移动到点\(j(j>i)\)的代价是\((h_i-h_j)^2+C\),其中\(C\)是给定的常数,求从点\(1\)移动到点\(n\)的最小代价。思路分析斜率优化DP板题。设\(f_i\)......
  • SP10582 题解
    题目链接题意简述给定一个有\(n\)个数的数组,求从第一个数字开始,向后每\(k\)个数字的最大值。题目分析看到没有人用ST表做那我就来发一个吧。这道题可以用ST表做。它可以在经过\(O(N\logN)\)的预处理后,以\(O(1)\)的时间在线回答下标在\(l\)到\(r\)之间的数......
  • 【题解】Luogu[P2607] [ZJOI2008] 骑士
    题目说给定\(n\)个点\(n\)个关系,也就是\(n\)条边,显然是基环树,又因为没有规定一定连通,于是我们可以将题目简化为给定一个基环树森林,点有点权,相邻的两个点不能同时选,问最大点权和。part1我们先考虑如果没有环,只是树,该怎么做。这一部分很简单,令\(f_{i,0/1}\)表示以\(i\)......
  • 基站建设 题解
    基站建设题目大意在平面上存在\(n\)个点,第\(i\)个点的坐标为\((x_i,0)\),具有一个发射半径\(r_i\)和一个费用\(v_i\)。连接具有方向性,当且仅当\(j<i\)且点\(i\)的接收范围与点\(j\)的发射范围相切时点\(i\)才能连接到点\(j\)。第\(i\)个点的发射范围是指一......
  • [ARC104E] Random LIS 题解
    [ARC104E]RandomLIS题解Link吐了,一下午就写了这一个题……主要是题解都说的很草率。然后上课的时候貌似讲的方法不是很能做(也许是我太菜了),总之我得写篇题解整理整理。首先\(n\)很小,可以直接爆搜所有相对大小,即我们去搜索\(1\)到\(n\)的排名,排名可以一样(即\(a_i\)相......
  • RTSP流媒体服务器LntonNVR(源码版)云服务平台下载录像后无法拖动时间轴的问题解决方案
    LntonNVR安防视频云服务平台是基于RTSP/Onvif协议的视频接入、处理及分发平台,可以分发出RTSP、RTMP、WS-FLV、HTTP-FLV、HLS、WebRTC等格式的视频流,可实现在全终端(PC、手机、平板、电子大屏/电视墙等)播放监控视频。有用户反馈,在使用LntonNVR下载录像时,下载后的录像时间无法拖动时间......
  • 【小学期实训】附加题题解——Good Karma
    [状压dp+容斥原理]实训附加题——GoodKarma目录[状压dp+容斥原理]实训附加题——GoodKarma题目描述题目输入格式输出格式数据范围样例输入1样例输出1样例输入2样例输出2样例解释2Solution题目描述题目链接题目「天空度假山庄」中有一个\(n\)点\(m\)边的无向图,图中点......