1. 程式人生 > >只包含因子2 3 5的數(數論,二分,加醜數思想)

只包含因子2 3 5的數(數論,二分,加醜數思想)

space priority tdi ins number 給定 個數 sin algorithm

個人心得:這題錯了很多很多次,一開始單純是想一直除2,3,5能除盡就可以了,但是數據太大,從第九組數據開始就超時了。

後面聽了隊友的意見打表,這裏用了醜數的思想,就是從2,3,5開始依次取出最小的數分別乘以2,3,5若不存在就放進優先隊列,

當然要用set就行存儲,s.count()就是查找是否存在的函數,可惜還是超時了,應該是stl中的lower_bound函數效率太低,

沒辦法就只能用另外的數組存儲然後自己根據二分寫查找函數,後面對longlong進行適當的輸出就過了。

題目:

K的因子中只包含2 3 5。滿足條件的前10個數是:2,3,4,5,6,8,9,10,12,15。 所有這樣的K組成了一個序列S,現在給出一個數n,求S中 >= 給定數的最小的數。 例如:n = 13,S中 >= 13的最小的數是15,所以輸出15。 Input
第1行:一個數T,表示後面用作輸入測試的數的數量。(1 <= T <= 10000)
第2 - T + 1行:每行1個數N(1 <= N <= 10^18)
Output
共T行,每行1個數,輸出>= n的最小的只包含因子2 3 5的數。
Input示例
5
1
8
13
35
77
Output示例
2
8
15
36
80
 1 #include<iostream>
 2 #include<cstring>
 3 #include<string>
 4 #include<cstdio>
 5 #include<vector>
 6 #include<cmath>
 7 #include<stack>
 8 #include<set>
 9 #include<queue>
10
#include<algorithm> 11 using namespace std; 12 #define in 1000000005 13 priority_queue<long long,vector<long long >,greater<long long > >pq; 14 set<long long >s; 15 int flag=0; 16 long long number[12000]; 17 bool pandu(long long x,long long y) 18 { 19 if((x-y)>=0) return true
; 20 else return false; 21 } 22 void dp() 23 { 24 int next[3]={2,3,5}; 25 for(int j=0;j<3;j++) 26 { 27 pq.push(next[j]); 28 s.insert(next[j]); 29 } 30 int i=1; 31 while(i<=12000) 32 { 33 long long t=pq.top();pq.pop(); 34 for(int j=0;j<3;j++){ 35 long long x=t*next[j]; 36 if(!s.count(x)) {s.insert(x);pq.push(x); i++;} 37 } 38 39 } 40 set<long long >::iterator it; 41 for(it=s.begin();it!=s.end();it++) 42 { 43 number[flag++]=*it; 44 } 45 } 46 int finda(int a,int b,long long x) 47 { 48 int pos=0; 49 int mid; 50 while(a<b){ 51 mid=(a+b)/2; 52 if(pandu(number[mid],x)) 53 { 54 b=mid;pos=b; 55 } 56 else 57 { 58 a=mid+1; 59 pos=a; 60 } 61 } 62 return pos; 63 64 } 65 int main() 66 { 67 int t; 68 scanf("%d",&t); 69 dp(); 70 while(t--){ 71 long long n; 72 cin>>n; 73 int t=finda(0,flag-1,n); 74 cout<<number[t]<<endl; 75 76 } 77 78 return 0; 79 }



只包含因子2 3 5的數(數論,二分,加醜數思想)