幼い頃からC++を学びましょう! USACO (アメリカ情報オリンピック) の銅部門コンテストに向けた学習プロセスでの質問を記録し、あらゆる瞬間を記録します。
概要の投稿を添付します:USACO の過去のブロンズ グループの実際の質問の分析 | Summary-CSDN ブログ
[タイトル説明]
Farmer John の N 牛は、納屋の室温に非常にうるさいです。より低い温度を好む牛もいれば、より暖かい温度を好む牛もいます。
農夫ジョンの牛舎には、1 番… N 個のN 個の牛舎が並んでいます。 > です。すべての牛が快適に過ごせるように、ファーマー ジョンは新しい空調システムを設置しました。システムの制御方法は非常に興味深いもので、システムにコマンドを送信して、連続するストールのグループの温度を 1 単位ずつ増減するように指示できます。たとえば、「ストール 5...8 の温度を上げてください」 1単位単位。「単位」。連続したペンのグループは 1 本のペンほど短くすることができます。 ti にしたいと考えています。彼女の小屋の気温は pi は、牛舎内の温度を i、各牛舎には 1 頭の牛がいます。牛
農場のジョンが、各牛舎がその中の牛にとって理想的な温度になるように、新しい空調システムに送信する必要があるコマンドの最小数を見つけるのを手伝ってください。
【入力】
输入的第一行包含 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