2018 ACM-ICPC North Central North America Regional Contest——Other Side(思维)

Other Side

题意:

输入 w , s , c , k ( 0 − 1 e 6 ) , m a x ( w , s , c ) > = 1 w,s,c,k(0-1e6),max(w,s,c)>=1 w,s,c,k(01e6),max(w,s,c)>=1;
w w w表示有 w w w W W W s s s表示有 s s s S S S, c c c表示有 c c c C C C, k k k表示船一次最多带 k k k个。
W W W S S S S S S C C C,人在的时候不会吃。问是否有一种方案使人能用船把它们带到对岸且所有都没有被吃。

题解:

首先分析第一次必须把 S 或 W + C S或W+C SW+C带到对岸,否则就会失败,即 k < m i n ( s , w + c ) kk<min(s,w+c)
其次若 k > m i n ( s , w + c ) k>min(s,w+c) k>min(s,w+c),不妨设 k > s k>s k>s,那么使 S S S永远在船上,剩下的空间用来带其它的,这样显然是可以的。
而当 k = m i n ( s , w + c ) k=min(s,w+c) k=min(s,w+c)时,不妨设 k = = s k==s k==s,那么肯定先把S送到对岸,然后空船返回,带 k 个 ( W + C ) k个(W+C) kW+C,到对岸,把 S S S带返回,再把剩余的 W + C W+C W+C带到对岸,最后回来带 S S S。这样最大化了 W + C W+C W+C的个数 w + c < = 2 ∗ k w+c<=2*k w+c<=2k

代码:

#include
using namespace std;
typedef long long ll;
int a,b,c,d;
int main(){
 // freopen("tt.in","r",stdin),freopen("tt.out","w",stdout);
  cin>>a>>b>>c>>d;
  bool flag=0;
  if(d>min(b,a+c)||d==min(b,a+c)&&max(b,a+c)<=2*d)flag=1;
  if(flag)puts("YES");else puts("NO");
  return 0;
}

你可能感兴趣的:(2018 ACM-ICPC North Central North America Regional Contest——Other Side(思维))