[ 题解 ] [ 模拟 ] H. Mixing Milk

http://codeforces.com/group/NVaJtLaLjS/contest/238203/problem/H


题意:

一开始123三个桶有各自的容量和初始牛奶量。规定从A桶向B桶倒牛奶直到A空了或B满了为止。

12倒牛奶开始,1=>22=>33=>1,循环100次,最后输出三个桶中的牛奶量。


典型模拟题。其实,最后一次是1=>2,只要操作数次,接下来三个桶中的牛奶量就有规律了。

这个次数就是4。自己想一想,为什么。


先不管这个。既然是模拟题我们就尽力描述它的过程。

不外乎两个问题:

哪个桶倒向哪个桶;

倒多少。


当然是A倒向B了。这里不要为三种情况写三段代码,根据循环次数给A/B赋值为1/2/3,下面的代码用AB表示即可。不然修改代码有可能有遗漏。


只有两种情况:B装得下/装不下。通过比较B桶剩余容量与A中牛奶量的大小,分为两种过程。


这样就完了。不然你还想咋样?


至于4是怎么来的,我没法解释它的原理,只能告诉你:

知道N个桶各自的容量,那无论各桶初始值多少,只要牛奶总量确定,倒N次后各桶内牛奶量总是确定的,并且从此时开始每倒N次都是一个循环。

4100%3+3来的,因为后面每倒三次都是重复的,所以取其中1=>2的状态就可以了。4710……9497100的效果是相同的。


代码如下:

 1 #include <stdio.h>
 2 long c[4]={0};
 3 long m[4]={0};
 4 int main()
 5 {
 6     for(int i=1;i<=3;i++)
 7         scanf("%ld%ld",c+i,m+i);
 8     for(int i=1;i<=4;i++)//100 => 4
 9     {
10         int out=i%3;
11         if(out==0)out=3;
12         int in=out+1;
13         if(in>3)in=1;
14 //        printf("%d,%ld,%ld,%ld,%d,%d\n",i,m[1],m[2],m[3],out,in);
15         if( c[in]-m[in] >= m[out] )
16         {
17             m[in]+=m[out];
18             m[out]=0;
19         }
20         else 
21         {
22             m[out]-= c[in]-m[in];
23             m[in]=c[in];
24         }
25     }
26     printf("%ld\n%ld\n%ld\n",m[1],m[2],m[3]);
27     return 0;
28 }

猜你喜欢

转载自www.cnblogs.com/Kaidora/p/10529768.html