题目描述
有三个小朋友一起聚会,各自带了一些饮料,他们突发奇想,把这些饮料混合一下,可能会产生特别的味道。于是他们将三个杯子编为 1、2、3 号,每个杯子可能有不同的容积,最开始装入的饮料也可能并没有装满。
他们混合的方法是这样的:
先从 1 号杯倒入 2 号杯,然后从 2 号杯倒入 3 号杯,再从 3 号杯倒入 1 号杯,如此循环下去,他们想知道这样操作 n次后,三个杯中的饮料会有多少。
注意:从 a杯倒入 b杯的时候,会尽量倒出更多的饮料,直到 a杯被倒空或 b 杯被倒满。
输入
第一行一个数 n ,表示操作的次数(1<=n<=105)。
接下来三行,每行包含两个空格分隔的整数(两个整数为不超过 109 的正整数),分别表示 1 到 3 号杯的容积和最开始的饮料量。
输出
三行,分别表示 1 到 3 号杯操作 n次后各自的饮料量。
输入输出样例
3 10 3 11 4 12 5
10 0 2
基本思路
此题需要一个周期,在判断周期内否加起来是否大于下一个组数容量的最大值,进行取舍依次循环,得出答案,具体如下:
首先我们需要实现自动循环,因为它最大只有3,所以除3保留原数,保留原数后在加上1,就可以实现自动循环。
q=p%3+1
其次,就到对容量的判断了,只需要对数减去的数加上原来的数即可 。
for(int i=1;i<=n;i++){
q=p%3+1;
if(b[q]+b[p]>a[q]){
b[p]=b[p]+b[q]-a[q];
b[q]=a[q];
}else{
b[q]+=b[p];
b[p]=0;
}
p=q;
}
最后输出
#include<bits/stdc++.h>
using namespace std;
int n,a[4],b[4],p=1,q;
int main(){
cin>>n;
for(int i=1;i<=3;i++){
cin>>a[i]>>b[i];
}
for(int i=1;i<=n;i++){
q=p%3+1;
if(b[q]+b[p]>a[q]){
b[p]=b[p]+b[q]-a[q];
b[q]=a[q];
}else{
b[q]+=b[p];
b[p]=0;
}
p=q;
}
for(int i=1;i<=3;i++){
cout<<b[i]<<endl;
}
return 0;
}