USACO历年青铜组真题解析 | 2018年12月Mixing Milk

学习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

猜你喜欢

转载自blog.csdn.net/guolianggsta/article/details/134919459