Codeforces Round #689 (Div. 2) 全文见:https://blog.csdn.net/qq_43461168/article/details/112976212
E. Water Level
题意:一桶水。初始k升,每天要喝掉x升,每天可以给他加y升。问能否使得 水位在t天之内 始终保持在 [L-R]的范围内。
思路:分类讨论。贪心。首先特判掉第一天。如果第一天可以加水,那先加个水再说。然后 如果第一天 一喝就小于 L 了,那显然没救了。否则就分情况讨论。
如果y < x, 那每天加的都不够喝的,看能坚持多少天就是了。
如果y > x, 那先让大家喝,喝到马上要掉出 L的范围了再加水。然后重复模拟这个过程。开map记录每次的水位值。如果水位出现了重复值。说明开始循环了,那么是可以一直坚持下去的。否则看能不能坚持到第t天,如果在某一天,不能加水了,且再喝就喝完了。那就坚持不了了。
AC代码:
#include <iostream>
#include <bits/stdc++.h>
#define int long long
#define mk make_pair
#define gcd __gcd
using namespace std;
const double eps = 1e-10;
const int mod = 1e9+7;
const int N = 3e5+7;
int n,m,k,t = 1,cas = 1;
int a[N],b[N];
int ans[N];
int sel = 0;
map<int,int> mp;
struct node{
int x,w;
node(int a,int b):x(a),w(b){}
};
queue<node> que;
signed main(){
//cin>>t;
while(t--){
int k,l,r,t,x,y;
cin>>k>>l>>r>>t>>x>>y;
if(k+y <= r) k += y;
if(k-x < l){ // can't last for the first day
cout<<"No"<<endl;
}else{
if(x > y){
int cost = x-y; // cost per day
if((t-1) <= ((k-l)-x)/cost){ // enough remain
cout<<"Yes"<<endl;
}else{ // not enough
cout<<"No"<<endl;
}
}else{
int dis = k-l;
int day = dis/x;
int cost = day*x;
int rem = k-cost;
int cnt = day;
while(1){
if(cnt >= t){
cout<<"Yes"<<endl;
break;
}
if(rem+y > r){
cout<<"No"<<endl;
break;
}else if(mp[rem]){ // show a loop
cout<<"Yes"<<endl;
break;
}
//cout<<rem<<endl;
mp[rem] = 1;
rem += y;
dis = rem-l;
day = dis/x;
cost = day*x;
rem = rem-cost;
cnt += day;
}
}
}
}
}