欢迎大家订阅我的专栏:算法题解:C++与Python实现!
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!
专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。
适合人群:
- 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
- 希望系统学习C++/Python编程的初学者
- 想要提升算法与编程能力的编程爱好者
附上汇总贴:USACO历年青铜组真题解析 | 汇总-优快云博客
【题目描述】
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 需要使用的最小指令数量。
【输入样例】
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