【无标题】

文章讨论了一个水量控制问题,初始水量为k,每天增加y,消耗x,目标是保持水量在[L,R]范围内至少t天。当x>=y时,主要考虑第一天能否增加y。当x<y时,通过减少水量和增加水量的策略,检查是否能维持t天。代码实现了一个解决方案,包括边界情况的处理和状态转移的判断。
摘要由CSDN通过智能技术生成

E. Water Level:


题意:

题意:初始水量为k,每天你可以使水量加y,然后每天必定消耗x的水,水量要始终在范围[L,R]中,问你能不能坚持t天


题目分析:

当x>=y时,我们每次可以减少x或者x-y,为了晚点到l,我们就减少y-x,所以我们只要看第一天能不能加y就可以。
当x<y时,我们可以先减到不能减,在加上y,因为x<=1e6,所以我们减去若干个x后余数一定在0~x-1,所以我们可以看余数是否出现过,如果出现,说明我们可以一直执行这个循环来使t为0,如果我们发现水量既不可以减去x,也不能加上y,说明不成立。


代码:

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#pragma GCC optimize(3)
using namespace std;
int k,l,r,t,x,y;
map<int,int> mp;
void solve(){
	cin>>k>>l>>r>>t>>x>>y;
	if(x>=y){
		__int128 tmp=1;
		if(k+y>r)
			tmp=tmp*k-tmp*t*x+tmp*(t-1)*y;
		else
			tmp=tmp*k-tmp*(x-y)*t;
		if(tmp>=l)cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
	else{
        int res=(k-l)%x;
		t-=(k-l)/x;
		mp[res]=1;
		bool flag=0;
		while(t>0){
			if(l+y+res>r){
				flag=1;
				break;
			}
			t-=(y+res)/x;
			res=(y+res)%x;
			if(mp[res])break;
			mp[res]=1;
		}
		if(!flag)
	    	cout<<"YES"<<endl;
		else 
			cout<<"NO"<<endl;
	}
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	solve();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值