牛客ioi18c

智斗恶龙

https://ac.nowcoder.com/acm/contest/7226/C

C
先bfs把所有可以访问的数字记录下,然后枚举每一个数作为区间最小的,整个区间长x,
这里特判下如果出生在陷阱或者不同数个数小于x直接no

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll>  pll;
typedef long double db;
typedef unsigned long long ull;
#define fi first
#define se second
#define pk push_back
#define mk make_pair

const ll N=1e3+10, M=0, mod=9901, inf=0x3f3f3f3f3f3f3f3f, Max=5e13;
const db esp=1e-7;

struct Pd{
    ll x,y,c;
    Pd(ll x=0,ll y=0,ll c=0):x(x),y(y),c(c){};
};
ll n, m, a[N][N], num[N*N], cnt, sx, sy, d, x;
queue<Pd> q;
bool vis[N][N];
ll  dx[4]={0,1,0,-1},
    dy[4]={1,0,-1,0};

void work(){
    scanf("%lld%lld%lld%lld%lld%lld",&n,&m,&sx,&sy,&d,&x);
    cnt=0;
    for(ll i=1;i<=n;i++) for(ll j=1;j<=m;j++)
        scanf("%lld",&a[i][j]), vis[i][j]=0;
    if(a[sx][sy]==-1){
        puts("no"); return ;
    }
    q.push(Pd(sx,sy,0)); vis[sx][sy]=1;
    while(q.size()){
        Pd f=q.front(); q.pop();
        ll x=f.x, y=f.y, c=f.c;
        if(a[x][y]!=-1&&a[x][y]!=0) num[cnt++]=a[x][y];
        for(ll i=0;i<4;i++){
            ll nx=x+dx[i], ny=y+dy[i];
            if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&vis[nx][ny]==0&&c<d&&a[nx][ny]!=-1)
                vis[nx][ny]=1, q.push(Pd(nx,ny,c+1));
        }
    }
    sort(num,num+cnt);
    cnt=unique(num,num+cnt)-num;
    if(cnt<x){
        puts("no"); return;
    }
    ll ans=inf;
    for(ll i=0,j=i+x-1;j<cnt;i++,j++){
        ans=min(ans,num[j]-num[i]);
    }
    if(ans==inf) puts("no");
    else printf("%lld\n",ans);
    return ;
}

int main() {
    ll t;
    for(cin>>t;t--;)
        work();
    return 0;
}

全部评论
可以的话点个赞把,谢谢大家的支持
点赞 回复 分享
发布于 2020-09-04 22:25

相关推荐

鼗:四级有点难绷,感觉能拿国家励志奖学金,学习能力应该蛮强的,四级确实不重要,但是拿这个卡你可是很恶心啊
点赞 评论 收藏
分享
6 1 评论
分享
牛客网
牛客企业服务