Codeforces Round #659 (Div. 2)B2. Koa and the Beach (Hard Version)思维

题意:给你n,k,l,表示koa距离目标的距离、涨潮的周期和koa的高度。koa一秒只能游泳一个距离。接着n个输入涨潮之前的海水高度。涨潮的规律是k秒上涨k秒下跌。当海水超过l时,koa就会被淹死。
传送门
题解:按照正常来走,首先判断当前位置是否最大差值能够直接走,如果可以,那么当前把潮变成落潮最大化-k(安全位置涨潮最大,然后最大慢慢落潮),如果不可以 那么就使上一个的潮增加1,这个过程需要更新就是max(上一次的潮+1,–(l-当前初始潮)),因为退潮的时候必须找到一个安全的最大退潮。

#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define fio ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define mse(a,b) memset(a,b,sizeof a)
#define pb push_back
#define pii pair<int,int>
using namespace std;
const int mod=1e9+7;
const int maxx=1e6+10;
const double eps=1e-6;
using namespace std;
const long double PI = 3.14159265358979323846;
//inline ll read(){ ll x=0,f=1; char ch=getchar(); while (!isdigit(ch)) { if (ch=='-') f=-1; ch=getchar(); } while (isdigit(ch)) { x=x*10+ch-48;  ch=getchar();  } return x*f;}
//ll cc = ((1ll << 62) - 1 + (1ll << 62));
/*struct node {
    ll l,r ,lazy,val;
    node() :l(),r(),lazy(),val(){}
    node(ll a, ll b, ll c,ll d) :l(a),r(b),lazy(c),val(d){}

};
*/
ll a[maxx];
signed main(){
   ll t; cin>>t;
   while(t--){
    ll n,k,l;  cin>>n>>k>>l;
    bool flag=false;
    for(ll i=1;i<=n;i++) cin>>a[i];
    ll water=-k,p;///water代表潮,+代表涨潮 -代表退潮
    for(ll i=1;i<=n;i++){
        p=l-a[i];/// 实际水位差
      if(p<0) {flag=true; break;}            //正常水位都会溺水,活不过去了,死定了
        if(p>=k)    water=-k;               //潮涨满了都淹不死,就等到潮涨满落潮时走(-k状态
        else    water=max(water+1, -p);     //一、最开始高过l,就等潮落到刚好淹不死的情况下到达该位置;二、可以直接走,水必须落潮1
        if(water>p) {flag=true; break;}        //每次水位变化后检查当前水位是否可以使之溺水
    }
    if(flag) cout<<"NO"<<endl;
    else cout<<"YES"<<endl;
    }
   return 0;
}


















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值