acm-(贪心、分类讨论)Codeforces Round #689 (Div. 2) E. Water Level

题面
传送门
首先让 k − = l , r − = l k-=l,r-=l k=l,r=l,方便后续讨论。
然后分三种情况。

一、若 y = x y=x y=x,当 k − x ≥ 0    o r    k + y ≤ r k-x\ge 0 \;or\; k+y\le r kx0ork+yr,那么输出 Y e s Yes Yes,否则输出 N o No No.

二、若 y < x y<x y<x,那么必定是能加水就立刻加水更优,不过考虑到第一天不一定能加水,所以这里还要分两种小情况:

  1. k + y ≤ r k+y\le r k+yr,每天一开始加 y y y升水,然后被同事消耗 x x x升水,总共消耗的水为 d = x − y d=x-y d=xy k k k升水最多消耗 t t = ⌊ k d ⌋ tt=\lfloor \frac kd\rfloor tt=dk天,若满足 t t ≥ t tt\ge t ttt输出 Y e s Yes Yes,否则输出 N o No No即可。
  2. k + y > r k+y>r k+y>r,第一天没法加水,故一来就会消耗 k − x k-x kx升水,后面的情况跟1一样,每天消耗 d = x − y d=x-y d=xy升水,故其实 k k k升水最多消耗 t t = 1 + ⌊ k − x d ⌋ tt=1+\lfloor \frac{k-x}d\rfloor tt=1+dkx天,若 t t ≥ t tt\ge t ttt输出 Y e s Yes Yes,否则输出 N o No No.

三、若 y > x y>x y>x,那么考虑贪心,先让同事每天喝水,直到恰好不能再消耗 x x x升水为止(继续消耗 k k k会变成负数),这时候再加 y y y升水,然后继续等同事喝水,直到恰好不能再消耗 x x x升水为止…考虑在这个过程中,假设每次将要加(还没加) y y y升水之前的 k k k升水在之前已经出现过了,那么直接输出 Y e s Yes Yes,因为这跟之前形成了一个封闭的循环,代表可以无限循环下去。否则的话水会一直涨,直到超过 r r r,我们记录在超过 r r r之前过去了多少天,这也是能够消耗的最长时间,如果这个时间是不小于 t t t的,那么输出 Y e s Yes Yes,否则输出 N o No No.

bool vis[maxn];
int main(){
	ll k=rd(),l=rd(),r=rd(),t=rd(),x=rd(),y=rd();
	k-=l;r-=l;
	if(y<=x){
		ll d=x-y;
		if(!d){
			if(k+y<=r || k-x>=0)wrsn("Yes");else wrsn("No");
		}else{
			ll tt=k/d;
			if(k+y<=r && tt>=t && k-t*d>=0)wrsn("Yes");else if(k-x>=0){
				tt=(k-x)/d;
				if(tt+1>=t && k-x-(t-1)*d>=0)wrsn("Yes");else wrsn("No"); 
			}else wrsn("No"); 
		}
	}else{
		ll cnt=0;
		while(true){
			cnt+=k/x;
			k%=x;
			if(vis[k])return wrsn("Yes"),0;
			vis[k]=1;
			k+=y;
			if(k>r)break; 
		}
		if(cnt>=t)wrsn("Yes");else wrsn("No"); 
	}
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值