说 实 话 看 到 这 题 一 开 始 我 也 是 懵 的 说实话看到这题一开始我也是懵的 说实话看到这题一开始我也是懵的
但 是 怎 么 做 呢 ? 会 分 类 就 很 好 做 。 但是怎么做呢?会分类就很好做。 但是怎么做呢?会分类就很好做。
分析
Ⅰ . 第 一 类 客 人 喜 欢 吃 多 的 那 个 饼 干 \color{Red}Ⅰ.第一类客人喜欢吃多的那个饼干 Ⅰ.第一类客人喜欢吃多的那个饼干
Ⅱ . 第 二 类 客 人 喜 欢 吃 少 的 那 个 饼 干 \color{Red}Ⅱ.第二类客人喜欢吃少的那个饼干 Ⅱ.第二类客人喜欢吃少的那个饼干
思路
解 法 一 、 让 第 二 类 客 人 先 吃 \color{orange}解法一、让第二类客人先吃 解法一、让第二类客人先吃
(首先感谢Code92007指正了我开始以为只能让第一类客人先吃的想法)
第二类客人最多吃 m i n ( a , b ) min(a,b) min(a,b)个饼干,如果这都没得吃那就不行。
否则第二类客人满足了,那么直接让第一类客人开始吃。
第一类客人可以先吃多的,吃到两种饼干相等就交替吃饼干
所 以 第 一 类 客 人 最 多 可 以 把 两 种 饼 干 吃 完 所以第一类客人最多可以把两种饼干吃完 所以第一类客人最多可以把两种饼干吃完
最后看看第一类客人能否满足就好了
解 法 二 : 让 第 一 类 客 人 先 吃 ( 麻 烦 一 点 ) \color{orange}解法二:让第一类客人先吃(麻烦一点) 解法二:让第一类客人先吃(麻烦一点)
先 让 第 一 类 客 人 先 吃 多 的 饼 干 直 到 两 种 饼 干 一 样 多 先让第一类客人先吃多的饼干直到两种饼干一样多 先让第一类客人先吃多的饼干直到两种饼干一样多
如 果 多 的 被 它 吃 之 后 仍 然 多 , 就 看 看 第 二 类 客 人 能 否 吃 饱 输 出 答 案 如果多的被它吃之后仍然多,就看看第二类客人能否吃饱输出答案 如果多的被它吃之后仍然多,就看看第二类客人能否吃饱输出答案
否 则 , 现 在 两 种 饼 干 变 得 一 样 多 了 , 接 下 来 怎 么 考 虑 ? \color{Red}否则,现在两种饼干变得一样多了,接下来怎么考虑? 否则,现在两种饼干变得一样多了,接下来怎么考虑?
现 在 就 让 第 二 类 人 吃 一 口 , 第 一 类 人 再 吃 一 口 ( 可 以 保 持 平 衡 ) 现在就让第二类人吃一口,第一类人再吃一口(可以保持平衡) 现在就让第二类人吃一口,第一类人再吃一口(可以保持平衡)
接 下 来 会 有 一 类 人 率 先 吃 完 , 那 么 就 简 单 判 断 剩 下 的 人 能 否 吃 饱 就 好 了 接下来会有一类人率先吃完,那么就简单判断剩下的人能否吃饱就好了 接下来会有一类人率先吃完,那么就简单判断剩下的人能否吃饱就好了
我比较菜,下面的代码想的是第二种做法
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a,b,n,m;
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>a>>b>>n>>m;
ll cha = max(a,b)-min(a,b);//先吃到饼干一样多
if(cha>=n) //如果没把多的吃到一样多第一类人就没了
{
ll s=min(a,b);//考虑第二类人即可
if(m<=s) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
else
{
a<b?b=a:a=b;//先吃到一样多
n-=cha;//耗费cha个第一类人去吃
ll chi=min(n,m);//第二类吃一口,第一类吃一口
if(a<chi||b<chi) cout<<"No"<<endl;
else
{
a-=chi,b-=chi;//注意此时a,b仍然相等
n-=chi,m-=chi;
if(n!=0)//此时剩下第一类人
{
if(a+b>=n) cout<<"Yes"<<endl;//第一类人最多全部吃掉
else cout<<"No"<<endl;
}
else//剩第二类人
{
if(a>=m) cout<<"Yes"<<endl;//只能吃少的
else cout<<"No"<<endl;
}
}
}
}
}