USACO历年青铜组真题解析 | 2021年12月Air Cownditioning

学习C++从娃娃抓起!记录下USACO(美国信息学奥赛)备考青铜组别比赛学习过程中的题目,记录每一个瞬间。

附上汇总贴:USACO历年青铜组真题解析 | 汇总-CSDN博客


【题目描述】

Farmer John 的 N 头奶牛对他们牛棚的室温非常挑剔。有些奶牛喜欢温度低一些,而有些奶牛则喜欢温度高一些。

Farmer John 的牛棚包含一排 N 个牛栏,编号为 1…N,每个牛栏里有一头牛。 第 i 头奶牛希望她的牛栏中的温度是 pi,而现在她的牛栏中的温度是 ti。为了确保每头奶牛都感到舒适,Farmer John 安装了一个新的空调系统。该系统进行控制的方式非常有趣,他可以向系统发送命令,告诉它将一组连续的牛栏内的温度升高或降低 1 个单位——例如「将牛栏 5…8 的温度升高 1 个单位」。一组连续的牛栏最短可以仅包含一个牛栏。

请帮助 Farmer John 求出他需要向新的空调系统发送的命令的最小数量,使得每头奶牛的牛栏都处于其中的奶牛的理想温度。

【输入】

输入的第一行包含 N。下一行包含 N 个非负整数 p1…pN,用空格分隔。最后一行包含 N 个非负整数 1…tN

【输出】

输出一个整数,为 Farmer John 需要使用的最小指令数量。

【输入样例】

扫描二维码关注公众号,回复: 17161638 查看本文章
5
1 5 3 3 4
1 2 2 2 1

【输出样例】

5

【代码详解】

#include <bits/stdc++.h>
using namespace std;
int n, p[100005], t[100005], a[100005], f[100005];
int main()
{
    cin >> n;  // 输入n
    for (int i=1; i<=n; i++) {  // 依次输入每个牛栏希望的温度
        cin >> p[i];
    }
    for (int i=1; i<=n; i++) {  // 依次输入每个牛栏现在的温度
        cin >> t[i];
    }
    for (int i=1; i<=n; i++) {  // 计算每个牛栏距离目标还需要增加的温度(可能存在负数)
        a[i] = p[i] - t[i];
    }
    if (a[1]>=0) f[1] = a[1];  // 默认f[1]为a[1]
    else f[1] = 0;  // 如果a[1]小于0,需特殊处理,f[1]为0

    for (int i=2; i<=n; i++) {  // 从第2个牛栏遍历至n个牛栏
        if (a[i-1]>=a[i]) f[i] = f[i-1];  // 如果比前一个牛栏需要增加的温度小,那f[i]不变
        else f[i] = f[i-1] + (a[i]-a[i-1]);  // 否则为前一个牛栏调整温度的指令数加上i与i-1的温度差值
    }
    if (a[n]<0) cout << f[n]+abs(a[n]);  // 如果最后一个值为负数,需要在执行a[n]次指令,使其变为0
    else cout << f[n];  // 否则输出f[n](递推式的最后一个就是总的指令数)
    return 0;
}

【运行结果】

5
1 5 3 3 4
1 2 2 2 1
5

猜你喜欢

转载自blog.csdn.net/guolianggsta/article/details/134836768
今日推荐