問題:jm同學在研究排列排列時發現一種有趣的組合,命名成友好組合。
當兩個數的二進位制表示中至少有kk個位置上的值不同,則稱這兩個數是相對安全。
例如:數字60轉成二進位制為:0 1 1 1 1 0 0
數字85轉成二進位制為:1 0 1 0 1 0 1
加粗位置上對應的值不同,60與85共有4個位置上的不同
他對友好組合的定義為:在nn個數中(0,1,2,…n-1)(0,1,2,…n−1)選出mm個數,這mm個數中任意兩個都是相對安全的。
你能夠幫wlxsq找出一種友好組合嗎?當然,如果有多組滿足條件的解,請輸出字典序最小的解。
輸入
輸入一行包含三個整數:n,m,kn,m,k,其表示的意思如題目描述
輸出
輸出字典序最小的友好組合,共mm個十進位制數。從小到大排序,相鄰兩個數字中間用空格隔開,每1010個一行。
資料保證至少能找到一種滿足條件的友好組合
樣例
輸入8 2 2
輸出0 3
輸入256 5 4
輸出0 15 51 60 85
提示資料規模
1≤n≤256,1≤m≤64,1≤k≤7,資料保證nn均為22的冪次
解題思路
這一題是競碼程式設計藍橋杯模擬賽的題,據說達到了b+的難度,額,我最後爆零,編譯錯誤(淦!理由是藍橋杯裡應該不能用itoa)
這一題的思路是,深度優先dfs,建立乙個結果序列,先將0加入到序列,從1開始往大找,每次找乙個數時,將它與結果序列中的每乙個數進行檢測,符合條件就加入序列。直到找齊n個數。
具體的**如下 ,dfs模板 加了乙個check做判斷,判斷用的是 按位與比較。
原始碼(c++)
#include
using
namespace std;
int book[
257]=;
int res[64]
;int m,n,k;
bool
check
(int step,
int i)
a=a>>1;
b=b>>1;
}if(sum}return1;
};void
dfs(
int step)
exit(0
);}for
(int i=
0;i};
intmain()
競碼程式設計 藍橋杯模擬賽5(試題I 調皮的JM)
剛開始只想到第一種,但是100 的資料絕對過不了,後來看提示半天過去了寫出來第二種,以此紀念寫出 的激動心情。小白的生存之道,太難了。第一種 public class main1 for int i 0 i h.length i b 0l c 0 這裡的i實現在字串h中按乙個字元乙個字元地向後面滑動...
2019 藍橋杯省賽 B 組模擬賽 程式設計 好友
題目 如下 includeusing namespace std int a 100005 int main 這道題如果你用暴力每次回溯去計算次數,就算加乙個優化,還是不能通過全部資料,因為暴力的複雜度達到了o n 2 這道題要用到二分的思想,首先將所有漁民房子的座標從小到大排序,然後從第乙個開始尋...
藍橋杯2023年4月模擬賽部分試題
問題描述 小明和朋友們一起去郊外植樹,他們帶了一些在自己實驗室精心研究出的小樹苗。小明和朋友們一共有n個人,他們經過精心挑選,在一塊空地上每個人挑選了乙個適合植樹的位置,總共n個。他們準備把自己帶的樹苗都植下去。然而,他們遇到了乙個困難 有的樹苗比較大,而有的位置挨太近,導致兩棵樹植下去後會撞在一起...