雖然題目標註的是貪心,但是,我覺得,用動態規劃可能會更簡單一點。
令dp[i]代表從1開始到第i個結束最少要分成的段數。
n=5,m=6。
a陣列下標
dp陣列41
1221
4325
4315
3ans=dp[n]=3
如果sum+a[i]<=m,則dp[i]=sp[i-1];sum+=a[i];因為第乙個一定要被切成1段,所以,dp[1]=1;否則,dp[i]=dp[i-1]+1;sum=a[i];
sum是記錄欄位和的變數。
因為sum記錄欄位和,則第一段的一開始的和一定是a[1];
#include
#include
using
namespace std;
const
int n=
100010
;int n,m,a[n]
,dp[n]
;void
init()
//輸入
void
solve()
else
}printf
("%d"
,dp[n]);
}int
main()
一本通 1 1 練習 2 數列分段
題目link 首先對於乙個序列,從 a 1 l 都符合最佳序列,假設對於第 l 1 個數,它放到從 l 1 r 的區間是一種最優的方法,並且它也可以放在從 1 l 1 這裡,那麼根據貪心,它放到 1 l 1 的序列中是合法的,而且也是一種最優方案。因此,這道題只需要貪心 能將當前數往左放就往左放。1...
一本通 1 1 練習 1 數列極差
題目傳送門 這題也是典型的貪心演算法題。對於這個問題 先通過例項來認識問題所描述的計算過程。令 n 3 取數列 3,5,7 可能有下面三種情況 3 5 1 7 1 113 3 7 1 5 1 111 5 7 1 3 1 109 由此可見先運算小資料的到的是最大值,先運算大資料得到的是最小值。故針對此...
C 一本通 1 1 練習 1 數列極差
一本通題庫 1427 libreoj 10005 vjudge 注意 一本通題庫和libreoj題意相同,但輸入格式不同。以一本通題庫為準。在黑板上寫了n nn個正整數作成的乙個數列,進行如下操作 每一次擦去其中的兩個數a aa和b bb,然後在數列中加入乙個數a b 1 a b 1 a b 1,如...