小l通過泥萌的幫助,成功解決了二叉樹的修改問題,並因此寫了一篇**,
成功報送了叉院(羨慕不?)。勤奮又勤思的他在研究生時期成功轉系,考入了北京大學光華管理學院!畢業後,憑著自己積累下的濃厚經濟學與計算機學的基礎,成功建設了乙個現代化奶牛場!
奶牛們十分聰明,於是在牛場建圍欄時打算和小l鬥智鬥勇!小l有n種可以建造圍欄的木料,長度分別是l1,l2 … ln,每種長度的木料無限。
修建時,他將把所有選中的木料拼接在一起,因此圍欄的長度就是他使用的木料長度之和。但是聰明的小l很快發現很多長度都是不能由這些木料長度相加得到的,於是決定在必要的時候把這些木料砍掉一部分以後再使用。
不過由於小l比較節約,他給自己規定:任何一根木料最多只能削短m公尺。當然,每根木料削去的木料長度不需要都一樣。不過由於測量工具太原始,小l只能準確的削去整數公尺的木料,因此,如果他有兩種長度分別是7和11的木料,每根最多只能砍掉1公尺,那麼實際上就有4種可以使用的木料長度,分別是6, 7,10, 11。
因為小l相信自己的奶牛舉世無雙,於是讓他們自己設計圍欄。奶牛們不願意自己和同伴在遊戲時受到圍欄的限制,於是想刁難一下小l,希望小l的木料無論經過怎樣的加工,長度之和都不可能得到他們設計的圍欄總長度。不過小l知道,如果圍欄的長度太小,小l很快就能發現它是不能修建好的。因此她希望得到你的幫助,找出無法修建的最大圍欄長度。
這一定難不倒聰明的你吧!如果你能幫小l解決這個問題,也許他會把最後的資產分給你1/8哦!
輸入格式:
輸入的第一行包含兩個整數n, m,分別表示木料的種類和每根木料削去的最大值。以下各行每行乙個整數li(1< li< 3000),表示第i根木料的原始長度。
輸出格式:
輸出僅一行,包含乙個整數,表示不能修建的最大圍欄長度。如果任何長度的圍欄都可以修建或者這個最大值不存在,輸出-1。
輸入樣例#1:
2 17 11
輸出樣例#1:
15
40 % :1< n< 10, 0< m< 300
100 % :1< n< 100, 0< m< 3000
裸的同餘類bfs,注意木棍長度不能為負,可以去重減少複雜度。
#include#include#include#include#includeusing namespace std;
const int n=105;
const int m=3005;
int n,m,nn,ans,a[n*m],dis[3005];
bool inq[3005];
queueq;
bool pd()
int main()
nn=unique(a+1,a+nn+1)-a-1;
memset(dis,0x3f,sizeof(dis));
dis[0]=0;
q.push(0);
inq[0]=1;
while(!q.empty())
}inq[u]=0;
} for(int i=1;i<=a[1]-1;i++)
ans=max(ans,dis[i]);
printf("%d\n",ans-a[1]);
return 0;
}
洛谷 P2662 牛場圍欄 題解
題目傳送門 題目大意 給出若干種木棍的長度,每種木棍數量無限,每根木棍可以削短 1 11 m mm 的長度再用,然後問用這些木棍不能組成的最大長度是多少,如果所有長度都能組成或不存在這個最大長度,那麼輸出 1 1 1。考慮同餘最短路,設長度 a aa 作為模數,求出 f ff 陣列,f i f i ...
揹包 最短路 洛谷2662 牛場圍欄 題解
給出n個物品,每個物品都有體積v且有無數個,問最大的不能組成的體積 如果均能組成或最大的不能組成的體積不存在輸出 1 我們很快就會發現這是揹包,但是這道題並沒有給出揹包上界,所以正常的揹包很難處理此問題。然而實際上有一種套路是 物品無限 物品體積小 揹包非常大 最短路!我們隨便取乙個物品,假設體積是...
Luogu2662 牛場圍欄(最短路)
小凱的疑惑公升級版的公升級版。答案若存在不會超過30002 3000,暴力dp似乎勉強可以過。當然這不優美。注意到如果能拼出長度為l的圍欄,就一定能拼出長度為l kx的圍欄,其中x為最短的 或任意乙個 圍欄長度。這樣將值域範圍縮小到了3000以內。於是將同餘類間連長為木料長度的邊,求出0為源點到每個...