Present 神奇 揹包 最短路

2022-05-20 02:42:34 字數 2635 閱讀 1668

先設 p1p

1​表示最小的 pp .

當 pxp

x​使用了 p1p

1​次時, 可以用 pxp

x​次 p1p

1​替代,

舉個例子, 假如當前選物品的情況是 ∑i=

2n(p

1−1)

pii=

2∑n​

(p1​

−1)p

i​, 此時只要在 x∈[

2,n]

x∈[2

,n] 中再選出任意乙個物品 pxp

x​,則 p1p

1​個px

px​ 就可以被 pxp

x​個p1

p1​ 頂替 .

由此可以想到乙個比暴力更優的揹包dpd

p方法,

使用總容量 ∑i=

1np1

pii=

1∑n​

p1​p

i​的揹包進行 dpd

p, 然後對於每個 aia

i​的判斷, 只需將 aia

i​模上 ∑i=

1np1

pii=

1∑n​

p1​p

i​(等同於∑i=

1np1

pii=

1∑n​

p1​p

i​全部被 p1p

1​頂替了), 此時 aia

i​一定是在揹包容量內的, 直接判斷即可 .

這樣可以有 60pt

s60pts.

使用 ∑i=

1np1

pii=

1∑n​

p1​p

i​為上界的原因是 ∑i=

1n(p

1−1)

pii=

1∑n​

(p1​

−1)p

i​是 p1p

1​不能消任何數字的極限情況, 以 ∑i=

1np1

pii=

1∑n​

p1​p

i​為上界就可以顧及到所有的裝填方法 .

思考能否以更小的揹包容量解決這個問題,

設 x=ym

odp1x=

ymod

p1​, 且 x

<

y, 則 y−x

=0mo

d  p1y

−x=0

modp

1​,即對於 mod

p1mo

dp1​

相同的x,y

x,y, 要湊成 y

y, 可以先湊成 x

x, 然後用 p1p

1​在 x

x 的基礎上填充 湊成 yy,

換句話說, 若兩個數模 p1p

1​的值相同, 且除 p1p

1​較小的那個數字可以湊出, 則較大的那個數字也可以湊出 .

上面這句話是 下方法的思想核心.

由此可以設 f[x

]f[x

] 表示 所有滿足 i%p

1=xi

%p1​

=x且能被湊出的 i

i 中, 最小的 ⌊ip

1⌋⌊p

1​i​

⌋,用類似最短路的演算法轉移, 最後只需檢查當前數字aia

i​是否滿足條件 f[a

i%p1

]≤⌊a

ip1⌋

f[ai

​%p1

​]≤⌊

p1​a

i​​⌋

即可 .

時間複雜度 o(p

1log

p1)o

(p1​

logp

1​) .

#include
#define reg register

#define fi first

#define se second

typedef std::pair<

int,

int> pr;

intread()

while

(isdigit

(c)) s = s*

10+ c-

'0', c =

getchar()

;return s * flag;

}int n;

int m;

int ans;

int p[

505]

;int a[

300005];

int f[

200005];

intmain()

}}for(reg int i =

1; i <= m; i ++)if

(f[a[i]

%p[1]]

<= a[i]

/p[1

]) ans ++

;printf

("%d\n"

, ans)

;return0;

}

D 和諧(最短路 01揹包)

自1945年以來,當美國的曼哈頓專案小組引爆了第一顆核彈時,全球的核 數量急劇增加。如今,fzu的乙個名叫aekdycoin的瘋狂男孩擁有核 想要毀滅我們的世界。幸運的是,我們神秘的間諜網路已經得到了他的計畫。現在,我們需要阻止它。但這項艱鉅的任務顯然並不容易。首先,我們知道,核 的作業系統由一些連...

HDU 3339 最短路 揹包問題

hdu 3339 mike w 2012 4 14 include include include define max size 128 define q size 256 define total dist max max size max size 100 define inf 9999999...

HDOJ3339 最短路 01揹包

題意 給出電站之間的路徑長度和每個電站的電量,需要派出坦克去攻占電站,以控制多一半的電量 要比一半多,因為這個wa了一次 問最少走多少路徑,坦克數量足夠多,乙個坦克只能控制乙個電站。思路 用floyd求出起點 0點 到所有電站的距離,當做揹包物品的價值,然後以每個電站的發電量作為揹包物品的容量,進行...