HDU3433 時間的二分 DP最優解

2021-07-25 14:27:45 字數 985 閱讀 8150

題意:

有n個人,x個任務a,y個任務b,

給出每個人做a做b的時間,乙個人只能在某個時刻做乙個工作,

問最短時間完成所有工作。

思路:二分n個人用的時間,判斷最優條件用dp。

可以二分就是因為時間越多的話肯定能做更多的task啊。

真的好神奇!n個人可以同一時間一起做事,那麼對於給定的時間,也就是說每個人都擁有這麼多時間,無非就是他會去怎麼安排,那麼就dp啊。

dp[i][j] 代表前 i 個人搞了 j 個a以後,還能搞多少個b;

判斷一發就是個0/1揹包,揹包容量就是時間,列舉第i個人做a任務的數量 j ,那麼b的數量 (time-a[i]*(j-k))/b[i];

//話說 對於求時間的問題,用二分搞的好多了!!!以後要想過去!!!dp最優解。

//突然發現對於二分這個搞法,真是每次想到都追悔莫及,瞎歪歪了乙個點子:

//錢越多東西就可以買的越多;時間花的越多,事情就可以辦的更多;the more...,the more...就可以用二分

#includeusing namespace std;

typedef __int64 ll;

int dp[210];

int a[60];

int b[60];

int n,x,y;

bool dp(int time)

}if(dp[x]>=y)

return true;

}return false;

}int main()

{ int t,cas=1;

scanf("%d",&t);

while(t--)

{scanf("%d%d%d",&n,&x,&y);

for(int i=1; i<=n; ++i)

scanf("%d%d",&a[i],&b[i]);

int left=0;

int right=600*1000;

while(left

hdu 2604 DP 矩陣二分

實際上就是這樣乙個問題,乙個序列僅由1和0組成,問n位不帶101和111子串行有多少個,結果模m 話說這是集訓的一道題,當時完全沒思路,今天做了一下,還是沒有做出來,不過好歹還會用最裸的記憶化搜尋。但肯定超時 話說集訓那時真的弱爆了。超弱的1b 看了下解題報告,發現1維dp既能搞定,再用矩陣二分。其...

hdu 3586 樹形dp 二分

題意 給n個節點的樹,要求使葉子節點與根斷開,割掉的邊的權值和不超過m。求這些被割邊的權值最大中的最小。dp u min dp v w w 為 u 到 v 的權值。如果w 大於二分的 mid dp u dp v 二分列舉邊權。include include include includeusing ...

hdu 1025 dp 二分 模板

題意 在一條河的兩邊各有n個位置,在這些位置之間建橋,要求所有橋之間不能交叉。現在告訴你所有可以建橋的位置,例如2,4,就是說河左邊的位置2可以與河右邊的位置4之間建橋,現在要求滿足要求的情況下最多可以建橋的個數。分析 想了好久發現是乙個最長上公升子串行問題,當時n比較大,所以一般的dp演算法不能解...