對測 離線DP 二分

2022-05-07 04:06:12 字數 3026 閱讀 1640

本人水平有限,題解不到為處,請多多諒解

本蒟蒻謝謝大家**

題目:market

(market.c/cpp/pas)

input fifile: market.in

output fifile: market.out

time limit: 1 seconds

memory limit: 128 megabytes

在位元鎮一共有 n 家商店,編號依次為 1 到 n。每家商店只會賣一種物品,其中第 i 家商店的物品

單價為 ci,價值為 vi,且該商店開張的時間為 ti。

byteasar 計畫進行 m 次購物,其中第 i 次購物的時間為 ti,預算為 mi。每次購物的時候,byteasar

會在每家商店購買最多一件物品,當然他也可以選擇什麼都不買。如果購物的時間早於商店開張的時間,

那麼顯然他無法在這家商店進行購物。

現在 byteasar 想知道,對於每個計畫,他最多能購入總價值多少的物品。請寫乙個程式,幫助

byteasar 合理安排購物計畫。

注意:每次所花金額不得超過預算,預算也不一定要花完,同時預算不能留給其它計畫使用。

input

第一行包含兩個正整數 n, m,表示商店的總數和計畫購物的次數。

接下來 n 行,每行三個正整數 ci , vi , ti,分別表示每家商店的單價、價值以及開張時間。

接下來 m 行,每行兩個正整數 ti , mi,分別表示每個購物計畫的時間和預算。

output

輸出 m 行,每行乙個整數,對於每個計畫輸出最大可能的價值和。

examples

market.in market.out

輸入

5 25 5 4

1 3 1

3 4 3

6 2 2

4 3 2

3 85 9

輸出

1012

第乙個計畫可以在商店 2,3,5 各購買一件物品,總花費為 1 + 3 + 4 = 8,總價值為 3 + 4 + 3 = 10。

第二個計畫可以在商店 1,2,3 各購買一件物品,總花費為 5 + 1 + 3 = 9,總價值為 5 + 3 + 4 = 12。

40分演算法

直接揹包 把總花費當做容量,總價值當做val ,再特判一下時間即可

設 f 為容量小於等於mi 的最大價值和

code:

#include#pragma gcc optimize(3)

using

namespace

std;

int n,m,sum=0,ans=0

;int f[1000001

];inline

intread()

while(isdigit(ch))

return x*f;

}struct

ooa[

100010

];struct

nodeb[

100010

];bool

cmp(oo a,oo b)

bool

comp(node a,node b)

intmain()

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

sort(a+1,a+n+1

,cmp);

//sort(b+1,b+m+1,comp);

//f[0][0]=0;

f[0]=0

;

for(int j=1;j<=m;j++)

}//ans+=f[n][b[j].mm];

} printf(

"%d\n

",f[b[j].mm]);

}return0;

}/*5 25 5 4

1 3 1

3 4 3

6 2 2

4 3 2

3 85 9

*/

100分做法:離線dp+二分

c[i](花費)很大但v[i](獲得的價值)很小,

f[j]表示獲利恰好為j時,所用的最小化費(初始設為正無窮)

方程f[j]=min(f[j],f[j-v[i]]+c[i])

於是對於每乙個詢問m,直接從後往前掃瞄,找到第乙個小於等於m的值,其下標就是答案

這裡這麼設定主要是因為考慮到60%時候的方程,當m變大時,v依然很小,於是考慮把下標和陣列的值更換一下位置

code:

#include#pragma gcc optimize(3)

#define n 503

#define ll long long

using

namespace

std;

int n,m,ans[100003

];ll f[n*n];

inline

intread()

while(isdigit(ch))

return x*f;

}struct

datab[

100003

],a[n],c[n];

intcmp(data a,data b)

intcmp1(data a,data b)

int calc(int

x)

else

}return

ans;

}int

main()

t++;}}

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

printf(

"%d\n

",ans[i]);

return0;

}

dp 二分查詢dp判斷

題意 掃雷,在長度為 lenght 的街道上有 n 個地雷,再輸入每個地雷在街道上的位置,1 lenght 1e9,1 n 2000 現有排雷範圍為w,2w的一次性排雷裝置,1 w,分別由p q個。現問w的值至少為多大。思路 先二分找w,對於每次二分的值寫乙個函式進行判斷。用dp來判斷,設dp式 d...

6 13校內互測 DP 帶權二分 斜率優化

丘中有麻plant 改自這兒,by zbq。還有隱藏的一頁不放了。直接走下去的話,如果開始時間確定那麼到每個點的時間確定,把time減去dis就可以去掉路程的影響了。這樣對於減去d後的t,如果想要摘一部分,那麼應是取其中最大的t恰好摘它,其它t較小的會早熟然後等著。意會一下吧 所以t大的會對t小的產...

中位數(DP 二分)

單點時限 10.0 sec 記憶體限制 256 mb 你的地圖是一張白紙,所以即使想決定目的地,也不知道路在 qq 小方最近在自學圖論。他突然想出了乙個有趣的問題 一張由 n 個點,m 條邊構成的有向無環圖。每個點有點權 ai。qq 小方想知道所有起點為 1 終點為 n 的路徑中最大的中位數是多少。...