学习C++从娃娃抓起!记录下USACO(美国信息学奥赛)备考青铜组别比赛学习过程中的题目,记录每一个瞬间。
附上汇总贴:USACO历年青铜组真题解析 | 汇总-CSDN博客
【题目描述】
农业,尤其是生产牛奶,是一个竞争激烈的行业。Farmer John 发现如果他不在牛奶生产工艺上有所创新,他的乳制品生意可能就会受到重创!
幸运的是,Farmer John 想出了一个好主意。他的三头获奖的乳牛,Bessie、Elsie 和 Mildred,各自产奶的口味有些许不同,他打算混合这三种牛奶调制出完美的口味。
为了混合这三种不同的牛奶,他拿来三个桶,其中分别装有三头奶牛所产的奶。这些桶可能有不同的容积,也可能并没有完全装满。然后他将桶 1 的牛奶倒入桶 2,然后将桶 2 中的牛奶倒入桶 3,然后将桶 3 中的牛奶倒入桶 1,然后再将桶 1 的牛奶倒入桶 2,如此周期性地操作,共计进行 100 次(所以第 100 次操作会是桶 1 倒入桶 2)。当 Farmer John 将桶 a 中的牛奶倒入桶 b 时,他会倒出尽可能多的牛奶,直到桶 a 被倒空或是桶 b 被倒满。
请告诉 Farmer John 当他倒了 100 次之后每个桶里将会有多少牛奶。
【输入】
输入文件的第一行包含两个空格分隔的整数:第一个桶的容积 c1,以及第一个桶里的牛奶量 m1。c1 和 m1 均为正,并且不超过 10^9。第二和第三行类似地包含第二和第三个桶地容积和牛奶量。
【输出】
输出三行,给出倒了 100 次之后每个桶里的牛奶量。
【输入样例】
10 3
11 4
12 5
【输出样例】
0
10
2
【代码详解】
#include <bits/stdc++.h>
using namespace std;
struct node {
int c, m;
}p[5];
int main()
{
for (int i=0; i<3; i++) { // 输入3个痛的容积和牛奶量
cin >> p[i].c >> p[i].m;
}
int mark = 0; // 定义下标mark
for (int i=1; i<=100; i++) { // 执行100次
int tmp = p[mark].m+p[(mark+1)%3].m; // 先统计当前桶和下一个桶的牛奶量总和
if (tmp>p[(mark+1)%3].c) { // 如果牛奶量大于下一个桶的容积
p[(mark+1)%3].m = p[(mark+1)%3].c; // 下一个桶将被装满
p[mark].m = tmp - p[(mark+1)%3].c; // 而当前桶只能倒出部分,留下部分
} else { // 牛奶量小于等于下一个桶的容积
p[(mark+1)%3].m = tmp; // 下一个桶就装下所有
p[mark].m = 0; // 当前桶就会被清空
}
mark++; // 更新下标
mark %=3 ; // 下标对3取余
}
for (int i=0; i<3; i++) { // 顺序打印3个桶的牛奶量
cout << p[i].m << endl;
}
return 0;
}
【运行结果】
10 3
11 4
12 5
0
10
2