ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-03-14 13:52:23  阅读:347  来源: 互联网

标签:ld 牛奶 int 题解 代码 模拟题 Mixing Milk out


<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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有