欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

CodeForces-1461E-Water Level

程序员文章站 2022-03-08 08:04:49
题目大意:思路:每一天的开始,可以加y升的水,每一天一定会用x升的水,需要保证每时每刻水量都在[l,r]。如果x=y:那么只要k-x>=l||k+x<=r,可以让水量一直维持在k(k∈[l,r])。如果x=t就输出Yes如果x>y:那么就可以模拟这个过程,并且记录变量...

题目大意:

CodeForces-1461E-Water Level

思路:

每一天的开始,可以加y升的水,每一天一定会用x升的水,需要保证每时每刻水量都在[l,r]。

如果x=y:那么只要k-x>=l||k+x<=r,可以让水量一直维持在k(k∈[l,r])。

如果x<y:那么k一定会不断减小。对于第一天,需要考虑是否可以加y升水。而之后第i天一定会减少x升水,第i+1天一定可以加入y升水,相当于一天减少delt=x-y升水。然后计算出维持的天数tot,如果tot>=t就输出Yes

如果x>y:那么就可以模拟这个过程,并且记录变量k是否到达过当前的值,一旦到达说明存在一个循环且该循环所有位置都处于[l,r]中,可以直接输出Yes。对于k,可以不断减少x,直到无法减少,此后一定可以再加y,再次减少x。每一次t-=(k-l)/x,k=k-(k-l)/x。一旦t<=0就输出Yes。用mp[]来记录k的轨迹,一旦出现mp[k]=1就到达了上述的循环。k减到无法再减x时候,k就应该加y,注意此时当天k一定要减少x。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll k,l,r,t,x,y;
map<ll,int>mp;
int main(){
	cin>>k>>l>>r>>t>>x>>y;
	if(x==y){
		if(k+y<=r||k-y>=l)cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
		return 0;
	}
	else if(x>y){
		ll delt=x-y,tot=0;
		if(k+y<=r)k+=y;
		if(k-x>=l){
			k-=x,tot++;
			tot=tot+(k-l)/delt;
		}
		if(tot>=t)cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
		return 0;
	}
	else{
		ll sign=0;
		while(1){
			t-=(k-l)/x;
			k=k-(k-l)/x*x;
			if(t<=0){
				cout<<"Yes"<<endl;
				return 0;
			}
			if(mp[k]){
				sign=1;
				cout<<"Yes"<<endl;
				return 0;
			}
			mp[k]=1;
			if(k+y<=r)k+=y;
			k-=x;t--;
			if(k<l||k>r)break;
		}
		cout<<"No"<<endl;
	}
	return 0;
}

本文地址:https://blog.csdn.net/Phoenix_ZengHao/article/details/111075146

相关标签: CodeForces 数学