洛谷2409Y的積木(二分答案)

2021-07-24 05:13:10 字數 1345 閱讀 2042

題目背景

y是個大建築師,他總能用最簡單的積木拼出最有創意的造型。

題目描述

y手上有n盒積木,每個積木有個重量。現在他想從每盒積木中拿一塊積木,放在一起,這一堆積木的重量為每塊積木的重量和。現在他想知道重量和最小的k種取法的重量分別是多少。(只要任意更換一塊積木,就視為一種不同的取法。如果多種取法重量總和一樣,我們需要輸出多次。)

輸入輸出格式

輸入格式:

第一行輸入兩個整數,n,k,意義如題目所描述。

每組資料接下來的n行,第乙個整數為mi,表示第i盒積木的數量,在同一行有mi個整數,分別表示每個積木的重量。

輸出格式:

一行,重量最小的k種取法的重量,要求對於每個資料,從小到大輸出

輸入輸出樣例

輸入樣例#1:

3 10

4 1 3 4 5

3 1 7 9

4 1 2 3 5

輸出樣例#1:

3 4 5 5 6 6 7 7 7 7

說明對於30%的資料:2<=mi<=10,1<=n<=10

對於50%的資料:2<=mi<=50,1<=n<=50

對於100%的資料:2<=mi<=100,1<=n<=100,1<=k<=10000,每個積木的重量為不超過100的正整數,所有mi的積大於等於k。本題不卡常。

【思路】在最小值與最大值之間二分答案mid(即第k小的數),若比mid小的個數大於等於k則向前搜尋,反之向後搜尋。

【注意】一定要找出準確的第k小的數,未到k位用mid補齊。

*注意陣列大小

#include #include #include #include #include #include #define maxn 102

using namespace std;

int n,k,a[maxn][maxn],mn=0,mx=0,lst[maxn],tot,ans[maxn*maxn*maxn/2];

int dfs(int x,int lim,int sum)

int res=0;

for(int i=1;i<=a[x][0];++i)

return res;

}bool okit(int lim)

void erfen(int l,int r)

bool ok=okit(l);

if(!ok)

else

}int main()

erfen(mn,mx);

sort(ans+1,ans+1+k);

for(int i=1;i<=k;++i)printf("%d ",ans[i]);

return 0;

}

洛谷 P2409 Y的積木

題目背景 y是個大建築師,他總能用最簡單的積木拼出最有創意的造型。題目描述 y手上有n盒積木,每個積木有個重量。現在他想從每盒積木中拿一塊積木,放在一起,這一堆積木的重量為每塊積木的重量和。現在他想知道重量和最小的k種取法的重量分別是多少。只要任意更換一塊積木,就視為一種不同的取法。如果多種取法重量...

洛谷 P2409 小Y的積木 (dp)

y是個大建築師,他總能用最簡單的積木拼出最有創意的造型。y手上有n盒積木,每個積木有個重量。現在他想從每盒積木中拿一塊積木,放在一起,這一堆積木的重量為每塊積木的重量和。現在他想知道重量和最小的k種取法的重量分別是多少。只要任意更換一塊積木,就視為一種不同的取法。如果多種取法重量總和一樣,我們需要輸...

動態規劃入門 洛谷P2409 Y的積木

y是個大建築師,他總能用最簡單的積木拼出最有創意的造型。y手上有n盒積木,每個積木有個重量。現在他想從每盒積木中拿一塊積木,放在一起,這一堆積木的重量為每塊積木的重量和。現在他想知道重量和最小的k種取法的重量分別是多少。只要任意更換一塊積木,就視為一種不同的取法。如果多種取法重量總和一樣,我們需要輸...