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