分享一道很有意思的演算法題目

2021-06-14 06:25:22 字數 1008 閱讀 5218

**:

題目:有100盞燈和100個開關,剛開始的時候等全是滅的,someone第一輪按下所有開關(開的按一下變滅,滅的按一下變開),第二輪隔乙個按一下(偶數個按),第三輪隔2個(3的倍數個按),求第100輪之後有多少盞燈是亮的。

本題有三個層次的解法:第乙個層次是暴力解法,即迴圈100輪,分別記錄每一盞等的狀態,最後統計一下亮燈的個數即可。此方法為下策,**不必贅述。

第二個層次是加入一些分析技巧。如果一盞燈被按到的次數是奇數次則該燈是亮的,否則是暗的。那麼一盞燈到底被按多少次呢?第i輪按下的是包含i的乘積因子的數,所以乙個數如果包含的乘積因子數目是j個則被按下的次數就是j。據此可設計**如下:

[cpp]view plain

copy

#include

using

namespace

std;  

//中策

intcomputerligth()  

for(j=2;j<=i/2;j++)  

if(total%2!=0)  

count+=1;  

}  return

count;  

}  int

main()    

3、上策:既然該數的乘積因子只有是奇數個時該燈才是亮的,那麼我們可以分析一下什麼樣的數才具有奇數個乘積因子。經分析發現只有該數是某整數的平方的數才有奇數個乘積因子,至於原因非常明了:數字n必定是兩個數的乘積,所以數字n可以分為k組兩兩相乘的數字組合,只有這兩兩相乘的數字相同時,該數才會有奇數個乘積因子。據此可設計如下**:

[cpp]view plain

copy

#include

using

namespace

std;  

//上策

intcomputerligth()  

intmain()    

是不是一道很有意思的題目,經過優化之後竟然只要一行**就能搞定。

一道很有意思的題目

先列出 然後再開始解析 include stdafx.h include using namespace std class a class b public a void seta a data,int idx int tmain int argc,tchar argv for int i 0 i...

一道很有意思的演算法題

已知陣列a n 由陣列a n 構造陣列b n 構造方法如下 product a 0 a 1 a n b i product a i 0 i n 要求如下 1.不能使用除法。2.不能宣告新的變數,不能申請新的記憶體。3.時間複雜度為o n 簡單分析 1.不能使用除法的話必須使用累乘。2.由於時間複雜度...

一道有意思的滑動視窗題目

今天看到了一道很有意思的leetcode題目,記錄一下。可獲得的最大點數 幾張卡牌 排成一行,每張卡牌都有乙個對應的點數。點數由整數陣列 cardpoints 給出。每次行動,你可以從行的開頭或者末尾拿一張卡牌,最終你必須正好拿 k 張卡牌。你的點數就是你拿到手中的所有卡牌的點數之和。給你乙個整數陣...