題目傳送門
題目大意:給出若干種木棍的長度,每種木棍數量無限,每根木棍可以削短 1
11 ~ m
mm 的長度再用,然後問用這些木棍不能組成的最大長度是多少,如果所有長度都能組成或不存在這個最大長度,那麼輸出 −1-1
−1。考慮同餘最短路,設長度 a
aa 作為模數,求出 f
ff 陣列,f[i
]f[i]
f[i]
表示模 a
aa 為 i
ii 且能組成的最小長度。
求完之後,假如 0
00 ~ a−1
a-1a−
1 中有乙個 f[i
]f[i]
f[i]
為 inf
\inf
inf(即不存在這樣的值),那麼答案就是 −1-1
−1,因為此時最大值為 i+a
×inf
i+a\times \inf
i+a×
inf,即不存在最大值。
否則的話,max−
a\max\-a
max−
a 就是答案,如果這個數為 0
00,那麼答案依然為 −1-1
−1。**如下:
#include
#include
#include
#include
using
namespace std;
#define maxn 3010
#define ll long long
#define inf 999999999999999999ll
int n,m,a;
struct edgee[maxn*maxn]
;int first[maxn]
,len=0;
void
buildroad
(int x,
int y,
int z)
;first[x]
=len;
}struct node
bool
operator
<
(const node &b)
const};
priority_queueq;
ll f[maxn]
;void
dij()}
bool v[maxn]
;int
main()
if(v[1]
)return
printf
("-1"),
0;for(
int i=
2;i<=
3000
;i++)if
(v[i]
)dij()
;ll ans=0;
for(
int i=
1;i(f[i]
==inf)
return
printf
("-1"),
0;else ans=
max(ans,f[i]
-a);if(
!ans)
printf
("-1");
else
printf
("%lld"
,ans)
;}
洛谷 P2662 牛場圍欄
小l通過泥萌的幫助,成功解決了二叉樹的修改問題,並因此寫了一篇 成功報送了叉院 羨慕不?勤奮又勤思的他在研究生時期成功轉系,考入了北京大學光華管理學院!畢業後,憑著自己積累下的濃厚經濟學與計算機學的基礎,成功建設了乙個現代化奶牛場!奶牛們十分聰明,於是在牛場建圍欄時打算和小l鬥智鬥勇!小l有n種可以...
揹包 最短路 洛谷2662 牛場圍欄 題解
給出n個物品,每個物品都有體積v且有無數個,問最大的不能組成的體積 如果均能組成或最大的不能組成的體積不存在輸出 1 我們很快就會發現這是揹包,但是這道題並沒有給出揹包上界,所以正常的揹包很難處理此問題。然而實際上有一種套路是 物品無限 物品體積小 揹包非常大 最短路!我們隨便取乙個物品,假設體積是...
Luogu2662 牛場圍欄(最短路)
小凱的疑惑公升級版的公升級版。答案若存在不會超過30002 3000,暴力dp似乎勉強可以過。當然這不優美。注意到如果能拼出長度為l的圍欄,就一定能拼出長度為l kx的圍欄,其中x為最短的 或任意乙個 圍欄長度。這樣將值域範圍縮小到了3000以內。於是將同餘類間連長為木料長度的邊,求出0為源點到每個...