題意:
有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演算法不能解...