日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

问题 F: 积木大赛(模拟)

發布時間:2024/9/3 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 问题 F: 积木大赛(模拟) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

時間限制: 1 Sec 內存限制: 128 MB

[提交][狀態][討論版]
題目描述
春春幼兒園舉辦了一年一度的“積木大賽”。今年比賽的內容是搭建一座寬度為n的大廈,大廈可以看成由n塊寬度為1的積木組成,第i塊積木的最終高度需要是hi。

在搭建開始之前,沒有任何積木(可以看成n塊高度為0的積木)。接下來每次操作,小朋友們可以選擇一段連續區間[L, R],然后將第L塊到第R塊之間(含第L塊和第R塊)所有積木的高度分別增加1。

小M是個聰明的小朋友,她很快想出了建造大廈的最佳策略,使得建造所需的操作次數最少。但她不是一個勤于動手的孩子,所以想請你幫忙實現這個策略,并求出最少的操作次數。

輸入
每組輸入數據包含兩行,第一行包含一個整數n,表示大廈的寬度。

第二行包含n個整數,第i個整數為hi。

數據規模:

其中一種可行的最佳方案,依次選擇 [1, 5] [1, 3] [2, 3] [3, 3] [5, 5]

對于30%的數據,有1≤n≤10;

對于70%的數據,有1≤n≤1000;

對于100%的數據,有1≤n≤100000,0≤hi≤10000。

輸出
每組輸出僅一行,即建造所需的最少操作數。

下面是對樣例數據的解釋:

其中一種可行的最佳方案,依次選擇

[1, 5] [1, 3] [2, 3] [3, 3] [5, 5]

樣例輸入

5 2 3 4 1 2

樣例輸出

5

提示
一.樸素解法:
ans = 0;
如果開始只有1堆積木,比如是2
那么 ans += 2 - 0;
有兩堆,2,3
ans += 2-0+3-2;
如果有三堆,2,3,2
ans += 2-0+3-2
四堆:2,3,2,3
ans += 2-0+3-2+3-2
.。。
所以每一堆的只與它前一堆有關,且只有大于前一堆時才需要更新答案,且是加兩者之差
二.遞歸解法:
給的序列還原成全部是0的序列:
每次在序列中找最小,根據最小的位置可以將原序列劃分為兩個子序列,然后子序列繼續找最小,繼續劃分,每次找到最小,將找最小序列全部減去這個最小值(已經為0的不再減)

AC_code:

樸素解法:

#include <stdio.h> using namespace std; typedef long long LL; int main() {int n;scanf("%d",&n);int tmp = 0,sum = 0;int x;for(int i = 0; i < n; i++){scanf("%d",&x);if(x > tmp) sum += x-tmp;tmp = x;}printf("%d\n",sum);return 0; }

遞歸解法:

#include <bits/stdc++.h> using namespace std; const int MAXN = 1e5+5; int a[MAXN]; int ans; void solve(int l,int r) {if(l > r) return;int minx = 1e5,pos;for(int i = l; i <= r; i++){if(a[i] < minx){minx = a[i];pos = i;}}for(int i = l; i <= r; i++){if(a[i])a[i] -= minx;}ans += minx;solve(l,pos-1);solve(pos+1,r); } int main() {int n;scanf("%d",&n);for(int i = 1; i <= n; i++){scanf("%d",&a[i]);}ans = 0;solve(1,n);printf("%d\n",ans);return 0; }

總結

以上是生活随笔為你收集整理的问题 F: 积木大赛(模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。