洛谷 P2662 牛場圍欄 題解

2021-10-07 02:54:57 字數 1681 閱讀 6732

題目傳送門

題目大意:給出若干種木棍的長度,每種木棍數量無限,每根木棍可以削短 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為源點到每個...