演算法入門經典 開燈問題

2021-08-04 20:10:06 字數 1003 閱讀 3367

演算法入門經典:開燈問題

前言:一直很羨慕那些善於寫演算法的同學,感覺他們真的很聰明,不想我這麼笨,一思考演算法就頭疼。罷了,從最簡單的開始吧,加油。

問題:

有n盞燈,編號為1~n,第1個人把所有燈開啟,第2個人按下所有編號為2的倍數的開關(這些燈將被關掉),第3個人按下所有編號為3的倍數的開關(其中關掉的燈被開啟, 開著燈將被關閉),依此類推。一共有k個人,問最後有哪些燈開著?

輸入:n和k,輸出開著的燈編號。k≤n≤1000。

樣例輸入:

7  3

樣例輸出:

1 5 6 7 

分析:

用 a[1],a[2],......,a[n] 表示編號為1,2,3,.......,n 的燈是否開著。

c語言實現:

//開燈問題

#include #include #define maxn 1010 //定義乙個稍比1000大的陣列

int a[maxn];

int main()

} printf("\n");

return 0;

}

輸出技巧:

演算法競賽中,常常難以精確計算出需要的陣列大小,一般會宣告的稍大一些。

為了避免輸出多餘的空格,設定乙個標誌變數first,可以表示當前要輸出的變數是否為第乙個。第乙個變數前不應有空格,但其他變數有。

附上我用c++實現的**:

#include #include using namespace std;

const int maxn = 1010;

int main()

} cout<< endl;

return 0;

}

開燈演算法問題

大廳裡有100盞燈,每盞燈都編了號碼,分別為1 100。每盞燈由乙個開關來控制。開關按一下,燈亮,再按一下燈滅。開關的編號與被控制的燈相同。開始時,燈是全滅的。現在按照以下規則按動開關。第一次,將所有的燈點亮。第二次,將所有2的倍數的開關按一下。第三次,將所有3的倍數的開關按一下。以此類推。第n次,...

經典演算法 開燈問題,貌似沒啥新解法了

有n盞燈,編號為1 n,第乙個人把所有燈開啟,第二個人按下所有編號為2的倍數開關 這些燈將被關掉 第三個人按下所有編號為3的倍數的開關 其中關掉的燈將被開啟,開著的燈將被關閉 一次類推,一共有k個人,問最後哪些燈開著?輸入 7 3 輸出 1 5 6 7 思路也是挺簡單的,用乙個布林陣列去儲存燈的開關...

硬幣問題 《演算法入門經典》

分析 典型的固定起始點的dag最長路最短路問題。起點為s,終點為0,只是注意一些細節。1 輸出答案。2 是否能走到0 include include include define maxn 100009 define inf 0x3f3f3f3f using namespace std int v ...