先設 p1p當 pxp1表示最小的 pp .
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
p1p
i的揹包進行 dpd
p, 然後對於每個 aia
i的判斷, 只需將 aia
i模上 ∑i=
1np1
pii=
1∑n
p1p
i(等同於∑i=
1np1
pii=
1∑n
p1p
i全部被 p1p
1頂替了), 此時 aia
i一定是在揹包容量內的, 直接判斷即可 .
這樣可以有 60pt
s60pts.
使用 ∑i=思考能否以更小的揹包容量解決這個問題,1np1
pii=
1∑n
p1p
i為上界的原因是 ∑i=
1n(p
1−1)
pii=
1∑n
(p1
−1)p
i是 p1p
1不能消任何數字的極限情況, 以 ∑i=
1np1
pii=
1∑n
p1p
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
1i
⌋,用類似最短路的演算法轉移, 最後只需檢查當前數字aia
i是否滿足條件 f[a
i%p1
]≤⌊a
ip1⌋
f[ai
%p1
]≤⌊
p1a
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點 到所有電站的距離,當做揹包物品的價值,然後以每個電站的發電量作為揹包物品的容量,進行...