洛谷 P2662 牛場圍欄

2021-07-24 12:44:32 字數 1685 閱讀 9786

小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 1

7 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為源點到每個...