不吃草的灰太郎
Description
小学奥数题有一个经典的题目:xjy带着一匹狼,一只羊和一捆草过河,河里有一艘船,船每次可以载一个人和一个物品,且只有xjy会划船。xjy希望把所有物品通过船送到对岸,但是当xjy不在时,狼会吃羊,羊会吃草,狼不会吃草。问怎样能把所有物品送到对岸。
聪明的你显然已经对这个问题的答案了如指掌,为了防止你拿到更多的气球,现在将问题升级:
现在,xjy正带着a匹狼,b只羊,c捆草要过河。河上有一艘容量为d的船,表示可以装载d个物品(狼,羊,草),不考虑xjy作为物品单位。请问对于给定的a,b,c,d,xjy能否在没有物品被吃掉的情况下将所有物品载到对岸?
Input
多组输入
每行输入a,b,c,d
0<=a,b,c,d<=1e6 且 a+b+c+d>=1
表示狼的数量,羊的数量,草的数量,船的容量。
输入总行数小于2e4
Output
对于每行输入
输出一行的字符串来表示xjy能否在没有物品被吃掉的情况下到达对岸
如果能 ,则输出“YES”,否则输出“NO”。(输出不包含引号)
Sample Input 1
2 2 0 1 1 1 1 1 0 0 0 1
Sample Output 1
NO YES YES
Hint
对于第一个样例 xjy无法将所有物品送到对岸。
对于第二个样例 xjy先将羊送到对岸,空船返回后将狼送到对岸,此时由于xjy在场狼不能吃羊,接着xjy将羊送回,此时由于xjy在场羊不能吃草,之后再将草送到对岸,空船返回,再将羊送到对岸。至此,将所有物品送到对岸。
狼不吃草,狼与草没有关系,所以可以把狼和草看做一类,羊是另一类,这两类不能在没有人的情况下在一起。
假定狼、草为黑,而羊为白,X=min(black,white)
当船容量足够大可以装下X且还有空间剩余时, 明显可以全部送达(将 X 一直放在船上来回运另一种颜色)。
若恰好 x=d,即没有空间剩余 时,另一种颜色必须小于等于 2*d(此时运法与 1 1 1 1 相同)
其他情况皆不可。
#include<cstdio>
using namespace std;
int main(){
int a,b,c,d;
while(~scanf("%d%d%d%d",&a,&b,&c,&d)){
if(d>a+c||d>b||(d==a+c&&b<=2*d)||(d==b&&a+c<=2*d))
printf("YES\n");
else
printf("NO\n");
}
return 0;
}