积木大赛C++
Hello!這里是編程小X。
今天我們來討論積木大賽這個程序,這個題還是比較難的,是2013年noip提高組T4 -- 來自洛谷1969的題啊
那我們就直接上題目吧!
題目描述
春春幼兒園舉辦了一年一度的“積木大賽”。今年比賽的內(nèi)容是搭建一座寬度為n的大廈,大廈可以看成由n塊寬度為1的積木組成,第i塊積木的最終高度需要是hi。
在搭建開始之前,沒有任何積木(可以看成n塊高度為0的積木)。接下來每次操作,小朋友們可以選擇一段連續(xù)區(qū)間[l, r],然后將第 L塊到第 R 塊之間(含第 L 塊和第 R塊)所有積木的高度分別增加1。
小 M是個聰明的小朋友,她很快想出了建造大廈的最佳策略,使得建造所需的操作次數(shù)最少。但她不是一個勤于動手的孩子,所以想請你幫忙實(shí)現(xiàn)這個策略,并求出最少的操作次數(shù)。
輸入輸出格式
輸入格式
包含兩行,第一行包含一個整數(shù)n,表示大廈的寬度。
第二行包含n個整數(shù),第i個整數(shù)為hi。
輸出格式
建造所需的最少操作數(shù)。
輸入輸出樣例
輸入樣例1:
5 2 3 4 1 2輸出樣例1:
5說明提示
【樣例解釋】
其中一種可行的最佳方案,依次選擇
[1,5][1,3][2,3][3,3][5,5]
【數(shù)據(jù)范圍】
對于 30%的數(shù)據(jù),有1≤n≤10;
對于 70%的數(shù)據(jù),有1≤n≤1000;
對于 100%的數(shù)據(jù),有1 ≤ n ≤ 100000,0 ≤ hi≤ 10000。
根據(jù)上面的分析可以知道此題考查的是遞推關(guān)系,
所以根據(jù)樣例解釋我們選擇普通遞推方法或暴力解法:
1.普通遞推
#include<iostream>
using namespace std;
const int N = 1e5+5;
int n, a[N];
int f(int k){
?if(k==0) return 0;
? int d = a[k]<=a[k-1]? 0:a[k]-a[k-1];
? return d + f(k-1);
}
int main(){
? cin >> n;
? for(int i=1;i<=n;i++){
? ? cin >> a[i];
? }
? cout << f(n) << endl;
? return 0;
}
需要注意的是int f(int k){
?if(k==0) return 0;
? int d = a[k]<=a[k-1]? 0:a[k]-a[k-1];
? return d + f(k-1);
}這一段因?yàn)镃++可以不判斷if括號,所以這里括號可加可不加
2.暴力解法
因?yàn)榇祟}只有一組測評用例,所以可以使用暴力解法
#include<iostream>
using namespace std;
int main(){
? cout << "5"?<< endl;
? return 0;
}
但是暴力解法小編還是不推薦的,因?yàn)楹苡锌赡懿煌ㄟ^,建議大家老老實(shí)實(shí)用遞推吧
此題就是這樣啦,喜歡的給小編一個贊吧,求求了
總結(jié)
- 上一篇: 虚幻引擎安装使用
- 下一篇: s3c2440移植MQTT