動態規劃測試test20170518

2021-08-01 19:30:48 字數 3926 閱讀 6031

題意:

乙個長度為n的序列(每個元素是(a

i,bi

) 這樣的數對),連續地分成若干組。每組左右邊界是(l

1,r1

) ,(l

2,r2

) ,⋯,(l

p,rp

) ,滿足li

=ri−

1+1 ,li

≤ri ,l1

=1,rp=

n 。分組必須滿足兩個條件:前面組的元素的b值比後面組元素的a值大;令mi

為第i個組內最大的a,所有mi

的和不超過li

mit 。令si為第i個組的元素的b的和,最小化ma

xsi 。

題解:

二分答案。

能否破除b和a的關係呢?

考慮什麼情況下必須**在一起。 如果a

i>bj

,那麼任意bk

≤bj ,都必須與ai

**在一起,否則不符合題意。

所以考慮排序bj

,然後從大到小掃。

然後剩下的就沒有限制了,於是問題就變成,給出乙個數列,(每個組a的最大值)的和不能超過limit,(各組內b的的和)的最大值最小。

然後乙個單調佇列優化dp,具體細節看**。

想交oj的話可以看這個spoj.com - problem seqpar2

然後lcy大神用線段樹,我跑了8.72s,而ta卻只要4s,線段樹題解看ta的吧:

題解:

這個題目有兩種做法,一種直接用斜率優化,另一種在斜率優化的基礎上進行點分治優化。

然後這個題目在noi2014上被加強了為購票,題目和做法差不多,可以參見這個題目的做法。

原題apio 2010特別行動隊

斜率優化經典題

**:

#include

#include

#include

#include

#include

#include

#define f(i,j,n) for(int i=j;i<=n;i++)

#define d(i,j,n) for(int i=j;i>=n;i--)

typedef

long

long ll;

const

int maxn = 100000+10;

using

namespace

std;

int n,l,r;

ll a,b,c,q[maxn],f[maxn],s[maxn];

inline

int read()

while (ch>='0'&&ch<='9')

return x*f;

}inline

double getk(int x,int y)

int main()

動態規劃測試3 test20170406

炸彈bombpasccpp time1s memory256m 戰爭warpasccpp time1s memory256m總結 突然就考試,做完1,2題就開始浪了。於是就第三題打了個暴力 用emacs之後 縮排似乎就呵呵了 高老大有乙個n n 的廣場,被均分成n n 個格仔。其中某些格仔種上了樹。...

動態規劃(2) 01揹包

給定n種物品和乙個揹包。物品i的重量是wi,其價值位vi 揹包的容量為c。問應該如何選擇裝入揹包的物品,使得轉入揹包的物品的總價值為最大?在選擇物品的時候,對每種物品i只有兩種選擇,即裝入揹包或不裝入揹包。不能講物品i裝入多次,也不能只裝入物品的一部分。因此,該問題被稱為0 1揹包問題。把這個過程理...

動態規劃(2) 01揹包

給定n種物品和乙個揹包。物品i的重量是wi,其價值位vi 揹包的容量為c。問應該如何選擇裝入揹包的物品,使得轉入揹包的物品的總價值為最大?在選擇物品的時候,對每種物品i只有兩種選擇,即裝入揹包或不裝入揹包。不能講物品i裝入多次,也不能只裝入物品的一部分。因此,該問題被稱為0 1揹包問題。把這個過程理...