只包含因子2 3 5的数(数论,二分,加丑数思想)

个人心得:这题错了很多很多次,一开始单纯是想一直除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 }

 



posted @ 2017-09-23 11:46  余生漫漫浪  阅读(804)  评论(0编辑  收藏  举报