比紫书优化,14行代码AC——例题 5-7 丑数(Ugly Numbers,UVa 136)——解题报告
題意:
丑數是一些因子只有2,3,5的數。數列1,2,3,4,5,6,8,9,10,12,15……寫出了從小到大的前11個丑數,1屬于丑數。現在請你編寫程序,找出第1500個丑數是什么。
沒有輸入
輸出:
The 1500’th ugly number is <…>.(<…>為你找到的第1500個丑數) 注意:<…>是你找到的數,
1、輸出中沒有尖括號;
2、輸出完應換行。
題目(提交)鏈接→UVa-136
思路:
如果按照正向思維分析,需要考慮除2,3,5以外的所有素數–這顯然不切實際。
因此考慮派生的性質:假設一個丑數為x,那么2x,3x,5x也都是丑數。
我們知道1是最小的丑數,因此從1開始,從小到大依次向后派生新丑數即可
心路歷程:
最開始想的是:通過上面的思路,每求出一個數就存入set容器(自動排序+去重),求到1500個為止,輸出。
但這個做法忽略了一種情況:設某數為x,后一個數為y,若x*5為第1500個數,按這個想法直接輸出, 但如果y*2 < x*5; 那么y*2就替換了x*5的位置,輸出第1500個數也就存在歧義了。
解決辦法:每個丑數分別*2,*3,*5后算作一次計算,計算滿1500次,輸出最后一個數即可。 因為平均下來,每次計算得出的新丑數一定等于1。
還有啊,我總覺得紫書中的給的源碼有一點強行用優先隊列解的意思,其實這道題只用set做容器就可以求出來。
代碼:
#include<bits/stdc++.h> using namespace std; int main() {set<long long> s; s.insert(1);set<long long>::iterator it = s.begin(); for(int i = 0; i < 1500; i++){long long x = *it;s.insert(x*2); s.insert(x*3); s.insert(x*5); it++; }it--;cout << "The 1500'th ugly number is " << *it << "." << endl; return 0; }收獲:
1、派生法求第n個x數。
2、count()函數去重。
日拱一卒,功不唐捐
總結
以上是生活随笔為你收集整理的比紫书优化,14行代码AC——例题 5-7 丑数(Ugly Numbers,UVa 136)——解题报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解题报告——例题 5-6团体队列(Tea
- 下一篇: 解题报告——例题5-8 Unix is