演算法
競賽入門經典(第2版) 第5章c++與stl入門 例
題5-7 醜數
uva136
感悟。
,菜題乙個。
2、基本思路,能被2整除,一直除2;能被3整除,一直除3;能被5整除,一直除5;最後值為1,則為醜數。
3、編好提交 limit exceeded,菜題不菜,感受到競賽題的威力。
4、用printf("time used = %.2f\n",(double)clock()/clocks_per_sec);測試時間23.21s,
5、這個思路有點牛:可以用暴力先把答案算出來。
6、提交wa,一查,少了最後乙個.號,修改,提交ac,在提交ac,看看時間,2016-11-17 18:39
7、對此題一直念念不忘,
一絲想法飄過,set集合中元素不可重複,非1醜數,醜數/2或醜數/3或醜數/5必是醜數,馬上編碼,應該**量很小,耗時明顯較短。但上機一除錯,耗時巨大。
8、通過
三篇部落格學習了優先佇列,效果還不錯。
9、點評書中**,寫點不一樣的地方:
一、因每次插入2x,3x,5x,故用int必越界,所以用long long,typedef方便原因有2,1是定義變數書寫**方便,2是方便測試,如typedef int ll;
二、因要查詢佇列中的元素,佇列沒有提供專門方法,故用set進行中轉,所以set不能省;
三、將2,3,5放在整數陣列中,寫起**for迴圈就搞定,不用2寫一次,3寫一次,5寫一次。
四、因為處理的資料都是醜數,不存在非醜數的計算,所以運算量小了許多許多,所以寫出的**才能通過測試。
附上ac**,編譯環境dev-c++4.9.9.2
#include
int main()
以上ac**的答案,來自time limit exceeded
**,如下:
#include
//#include
//#include
using namespace std;
int main()
while(ans%3==0)
while(ans%5==0)
if(ans==1)
if(count==1500)
break;
}cout<<"the 1500'th ugly number is "《兩個**造就了ac程式。此時2016-11-17 18:33
附上消化書中寫的ac**。
#include
#include
#include
using namespace std;
typedef long long ll;
int main();
int j;
pq.push(1);
s.insert(1);
for(i=1;;i++){
x=pq.top();
pq.pop();
if(i==1500){
cout<<"the 1500'th ugly number is "<
Uva136 醜數 優先佇列
找出第1500個素因子只能有2或3或5的數。懵逼了吧,並不是素因子篩,用2,3,5去篩並不能得到滿足醜數要求的數,例如14就篩不掉。優先佇列每次取乙個最小的數x,2x,3x,5x,都是醜數,但是每次要判斷是否有重數 set 取1500,每次都是取出最小的數,取1500次之後就是第1500個數。inc...
例題5 7 醜數
描述 醜數是指不能被2,3,5以外的其他素數整除的數。把醜數從小到大排列起來,結果如 下 1,2,3,4,5,6,8,9,10,12,15,求第1500個醜數。思路 從小到大依次生成。最基礎的醜數是1,而後的所有醜數都是在這個基礎上生成的。如果按照正向思維分析,需要考慮除2,3,5以外的所有素數 這...
UVA136解題報告
先來份錯誤 親愛的小夥伴們,希望你們能找到其中的問題,順便說一句,用的是廣搜 include includeusing namespace std int main printf d n q.front return 0 上面是我用很短的時間寫出來的很漂亮的 如果說有什麼不完美的地方,那就是他是錯的...