你有一些狼(a)、羊(b)、卷心菜(c),想把他们弄到河对岸去,你只有一张船,船有最大载容量(d)。
每次运东西到河对岸都不能超过船的最大容载量,并且当你不在场的情况下,狼会吃羊,羊会吃卷心菜,但是狼不会吃卷心菜。
现在你需要判断自己可不可以在无损失的情况下,将自己的狼、羊、卷心菜运到河对岸?
思路:
1.你要判断是不是可以把(羊)或者(狼和卷心菜)一次性全部运到对岸,如果不可以的话,第一次运输的过程肯定会有损失。
判断d是不是大于b或者d是不是大于a+c
2.如果满足第一个条件的话才进行接下来的判定,否则直接判断不可以就行了
第二步判断分成两部分
以船的载容量大于等于羊的数量为例(跟船的载容量大于狼和卷心菜的数量相同的道理)
如果是大于不包含等于的话,直接就是可以的。因为你可以把羊一直放在船上,并且船是不满的,你可以把空余的位置放上狼或者是卷心菜,顶多,多送几次就是了,先把狼和卷心菜运到对岸,最后才把一直在船上的羊送到对岸。
如果是等于的话,就要进行判断了。
最大的情况:首先把羊全部送到对岸,回来把一部分狼和卷心菜送到对岸,把羊全部接回来。
这样可以再送一次,如果剩下的狼和卷心菜可以全部送到对岸,那么剩下的羊再送一次就可以了,答案就是可以的,否则就是不可以的。
那么最大的情况就是:狼和卷心菜的数量小于等于船的载容量的两倍,这就是在羊的数量等于船的载容量的情况下,狼和卷心菜所能达到的最大数量:2d
如果是狼和卷心菜的数量小于等于船的载容量,跟上面的过程一样。
这就是具体的过程了,下面给出用计算机实现的代码:
缺少头文件。
x,y,z,k分别代表狼的数量、羊的数量、卷心菜的数量、船的容载量
int main()
{
int x,y,z,k;
cin >> x >> y >> z >> k;
if(y<=k)
{
if(y<k)
{
cout <<“YES“<< endl;
return 0;
}
else if(x+z<=2*k)
{
cout <<“YES“<< endl;
return 0;
}
}
else if(x+z<=k)
{
if(x+z<k)
{
cout <<“YES“<< endl;
return 0;
}
else if(y<=2*k)
{
cout <<“YES“<< endl;
return 0;
}
}
cout <<“NO“<< endl;
return 0;
}