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:那么就可以模拟这个过程,并且记录变量...
题目大意:
思路:
每一天的开始,可以加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
推荐阅读
-
AS报错:lambda expressions are not supported at this language level
-
Flash AS3教程:Level2D类
-
XMLHttpRequest Level 2 使用指南
-
PAT (Basic Level) Practice (中文)1001
-
IndentationError: unindent does not match any outer indentation level笔记
-
C#9.0新特性详解——*程序语句(Top-Level Programs)
-
曜越Level 20 RGB机械键盘图赏:带滚轮式音量调节旋钮
-
1083 是否存在相等的差 PAT (Basic Level)
-
Android中使用getDrawable时提示:Call requires API level 21(current min is 15)
-
Java High Level REST Client 使用教程