cf1461 E. Water Level(模拟,暴力,贪心 ,讨论)

题目链接:https://codeforces.ml/contest/1461/problem/E

题意:给定6个数k,l,r,t,x,y。(1<=l<=k<=r<=1e18,1<=t<=18,1<=x<=1e6,1

<=y<=1e18)。k表示初始水位,l,r表示水位必须在任何时刻在这个范围内,t表示判断是否能待满的天数,x表示每日用水量,y表示每日可加水量(可加可不加)。

题解:题意真的很简单,就是不知道怎么才300多人过,以至于我也比较懈怠了,不应该啊!!

讨论最多能维持res天.

if x==y:要么0天,要么无数天。

elif x<y:每次肯定是要先加y,再减x。

elif x>y:每次加y(可以加就加)之后减x到不能减,然后mp[k-l]=1(遇到之前就已经mp[k-l]就跳出无穷大)。因为x<=1e6所以最多跑1e6次。

总结:唉,思路还是不够清晰,感觉水平应该是在1800以上了,但是赛场上开题还是得重视,不能得了个差不多的名次就懈怠了。只有拥有最好的状态,才能够不断的去突破自己。

唉,终究是状态不好,思路也不够清晰。上一次有比赛大概是5,6天前而且这一周复习专业课也没有碰代码,稍微生疏了一些。

代码还是很简单的,可能文字题解不够,看代码一下子就懂了:

#include <bits/stdc++.h>

#define ll long long
#define ld double
#define pi acos(-1)
#define pb push_back
#define mst(a, i) memset(a, i, sizeof(a))
#define pll pair<ll, ll>
#define fi first
#define se second
#define mp(x, y) make_pair(x, y)
#define rep(i, a, n) for (ll i = a; i <= n; i++)
#define per(i, n, a) for (ll i = n; i >= a; i--)
#define dbg(x) cout << #x << "===" << x << endl
using namespace std;

template<class T>void read(T &x){T res=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){res=(res<<3)+(res<<1)+c-'0';c=getchar();}x=res*f;}
inline void print(ll x){if(x<0){putchar('-');x=-x;}if(x>9)print(x/10);putchar(x%10+'0');}
const ll maxn = 1e6 + 10;
const ll mod = 1e9 + 7;

ll k, l, r, t, x, y;
ll mp[maxn];
bool ok(ll x) {
    if (x >= l && x <= r)
        return true;
    else
        return false;
}
ll solve1(){
    ll res=0;
    if(ok(k+y)) k+=y;
    if(x==y){
        if(ok(k)&&ok(k-x)) return 8e18;
        else return res;
    }
    else if(y<x){
        if(!ok(k-x)) return res;
        else k-=x,res++;
        ll z=x-y,tt=(k-l)/z;
        res+=tt,k-=tt*z;
    }
    else if(y>x){
        if(!ok(k-x)) return res;
        else k-=x,res++;
        //
        ll tt;
        while(ok(k)){
            tt=(k-l)/x;res+=tt,k-=tt*x;
            if(mp[k-l]==0) mp[k-l]=1;
            else if(tt>0) return 8e18;
            k+=y;
        }
    }
    return res;
}
int main() {
    ll _s = 1;
    // read(_s);
    // freopen("testdata.in","r",stdin);
    // freopen("testout.out","w",stdout);
    for (ll _ = 1; _ <= _s; _++) {
        read(k), read(l), read(r), read(t), read(x), read(y);
        // ll mx=0;
        ll mx=solve1();
        bool f = false;
        if (t <= mx) f = true;
        // dbg(mx);
        puts(f ? "Yes" : "No");
    }
    return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值