[ 题解 ] [ 模拟 ] H. Mixing Milk
作者:互联网
<style></style>
http://codeforces.com/group/NVaJtLaLjS/contest/238203/problem/H
题意:
一开始1、2、3三个桶有各自的容量和初始牛奶量。规定从A桶向B桶倒牛奶直到A空了或B满了为止。
从1向2倒牛奶开始,1=>2,2=>3,3=>1,循环100次,最后输出三个桶中的牛奶量。
典型模拟题。其实,最后一次是1=>2,只要操作数次,接下来三个桶中的牛奶量就有规律了。
这个次数就是4。自己想一想,为什么。
先不管这个。既然是模拟题我们就尽力描述它的过程。
不外乎两个问题:
哪个桶倒向哪个桶;
倒多少。
当然是A倒向B了。这里不要为三种情况写三段代码,根据循环次数给A/B赋值为1/2/3,下面的代码用AB表示即可。不然修改代码有可能有遗漏。
只有两种情况:B装得下/装不下。通过比较B桶剩余容量与A中牛奶量的大小,分为两种过程。
这样就完了。不然你还想咋样?
至于4是怎么来的,我没法解释它的原理,只能告诉你:
知道N个桶各自的容量,那无论各桶初始值多少,只要牛奶总量确定,倒N次后各桶内牛奶量总是确定的,并且从此时开始每倒N次都是一个循环。
4是100%3+3来的,因为后面每倒三次都是重复的,所以取其中1=>2的状态就可以了。4、7、10……94、97、100的效果是相同的。
代码如下:
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 }
标签:ld,牛奶,int,题解,代码,模拟题,Mixing,Milk,out 来源: https://www.cnblogs.com/Kaidora/p/10529768.html