您的位置:首页 > 其它

51nod-1010 只包含因子2 3 5的数

2016-10-10 21:49 197 查看
思路:打表。二分查找。网上都这么说。然而我想说。这打表的思路并不好想有没有。给出自己的一个打表方式虽然炸了。。不过也是种思路。(来自UVA 540)int pos2=1,pos3=1,pos5=1;ans[1]=1;for(int i=2;i<=1500;i++){int v2=ans[pos2]*2;int v3=ans[pos3]*3;int v5=ans[pos5]*5;ans[i]=min(min(v2,v3),v5);if(ans[i]==v2)pos2++;if(ans[i]==v3)pos3++;if(ans[i]==v5)pos5++;}cout<<ans[1500]<<endl;
然后再写这题的打表const ll maxn = 1e18+999;void init(){ll i, j, k;for(i = 1; i < maxn; i*=2)for(j = 1; i*j < maxn; j*=3)for(k = 1; k*j*i < maxn; k*=5)a[cnt++] = i*j*k;}俩种方法本质区别是  第二种方法长度更广,速度更快,思路是每次把当前的2  3  5取尽。最后二分查找。可以lower_bound()也可以#include <iostream>#include <stdio.h>#include <algorithm>using namespace std;typedef long long ll;const int N = 50086;ll a;int cnt = 0;const ll maxn = 1e18+999;void init(){ll i, j, k;for(i = 1; i < maxn; i*=2)for(j = 1; i*j < maxn; j*=3)for(k = 1; k*j*i < maxn; k*=5)a[cnt++] = i*j*k;}int main(){   init();sort(a,a+cnt);int  T;cin>>T;while(T--){ll n;scanf("%lld", &n);ll l = 1, r = cnt, mid;while(l<r){mid = (l+r)>>1;if(a[mid] >= n){r = mid;}else l = mid+1;}printf("%lld\n", a[l]);}return 0;}
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: