51nod 1010 只包含因子2 3 5的数 && poj - 1338 Ugly Numbers(打表)

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1010

http://poj.org/problem?id=1338

首先poj这题要找出第n个丑数,想到要打表,因为每一个丑数都是由前一个丑数*2或者*3或者*5得到,每次取3种结果种较小的那一个放入数组中.

打表的时候要注意保持数组有序.

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <vector>
 5 #include <cstring>
 6 #include <string>
 7 #include <algorithm>
 8 #include <string>
 9 #include <set>
10 #include <functional>
11 #include <numeric>
12 #include <sstream>
13 #include <stack>
14 #include <map>
15 #include <queue>
16 //#pragma comment(linker, "/STACK:102400000,102400000")
17 #define CL(arr, val)    memset(arr, val, sizeof(arr))
18
19 #define ll long long
20 #define inf 0x7f7f7f7f
21 #define lc l,m,rt<<1
22 #define rc m + 1,r,rt<<1|1
23 #define pi acos(-1.0)
24
25 #define L(x)    (x) << 1
26 #define R(x)    (x) << 1 | 1
27 #define MID(l, r)   (l + r) >> 1
28 #define Min(x, y)   (x) < (y) ? (x) : (y)
29 #define Max(x, y)   (x) < (y) ? (y) : (x)
30 #define E(x)        (1 << (x))
31 #define iabs(x)     (x) < 0 ? -(x) : (x)
32 #define OUT(x)  printf("%I64d\n", x)
33 #define lowbit(x)   (x)&(-x)
34 #define Read()  freopen("a.txt", "r", stdin)
35 #define Write() freopen("b.txt", "w", stdout);
36 #define maxn 1010
37 #define maxv 1010
38 #define mod 1000000000
39 using namespace std;
40 ll p[1555];
41 int main()
42 {
43     //freopen("a.txt","r",stdin);
44     int i=1,j=1,k=1;
45     p[1]=1;
46     for(int l=2;l<=1500;l++)
47     {
48         p[l]=min(p[i]*2,min(p[j]*3,p[k]*5));
49         if(p[l]==p[i]*2) i++;
50         if(p[l]==p[j]*3) j++;
51         if(p[l]==p[k]*5) k++;
52         //printf("%lld\n",p[l]);
53     }
54     int n;
55     while(~scanf("%d",&n)&&n)
56     {
57         printf("%lld\n",p[n]);
58     }
59     return 0;
60 }

51nod这题让你求>=n的丑数,因为n很大,所以打完表后需要二分查找,打表的时候要注意直到大于10^18,上限可以自己试几次.

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 #include <vector>
 5 #include <cstring>
 6 #include <string>
 7 #include <algorithm>
 8 #include <string>
 9 #include <set>
10 #include <functional>
11 #include <numeric>
12 #include <sstream>
13 #include <stack>
14 #include <map>
15 #include <queue>
16 //#pragma comment(linker, "/STACK:102400000,102400000")
17 #define CL(arr, val)    memset(arr, val, sizeof(arr))
18
19 #define ll long long
20 #define inf 0x7f7f7f7f
21 #define lc l,m,rt<<1
22 #define rc m + 1,r,rt<<1|1
23 #define pi acos(-1.0)
24
25 #define L(x)    (x) << 1
26 #define R(x)    (x) << 1 | 1
27 #define MID(l, r)   (l + r) >> 1
28 #define Min(x, y)   (x) < (y) ? (x) : (y)
29 #define Max(x, y)   (x) < (y) ? (y) : (x)
30 #define E(x)        (1 << (x))
31 #define iabs(x)     (x) < 0 ? -(x) : (x)
32 #define OUT(x)  printf("%I64d\n", x)
33 #define lowbit(x)   (x)&(-x)
34 #define Read()  freopen("a.txt", "r", stdin)
35 #define Write() freopen("b.txt", "w", stdout);
36 #define maxn 1010
37 #define maxv 1010
38 #define mod 1000000000
39 using namespace std;
40 ll p[10999];
41
42 ll erfen(ll n)
43 {
44     int l=1,r=10999;
45     while(l<=r)
46     {
47         int mid=(l+r)/2;
48         if(p[mid]==n) return p[mid];
49         else if(p[mid]>n) r=mid-1;
50         else l=mid+1;
51     }
52     if(p[l]<n) l++;
53     return p[l];
54 }
55 int main()
56 {
57     freopen("a.txt","r",stdin);
58     int i=1,j=1,k=1;
59     p[1]=1;
60     for(int l=2;l<=10999;l++)
61     {
62         p[l]=min(p[i]*2,min(p[j]*3,p[k]*5));
63         if(p[l]==p[i]*2) i++;
64         if(p[l]==p[j]*3) j++;
65         if(p[l]==p[k]*5) k++;
66         //printf("%lld\n",p[l]);
67     }
68     //printf("%lld\n",p[10000]);
69     int t;
70     ll n;
71     scanf("%d",&t);
72     while(t--)
73     {
74         scanf("%lld",&n);
75         {
76             if(n==1) printf("2\n");
77             else
78             printf("%lld\n",erfen(n));
79         }
80     }
81     return 0;
82 }
时间: 2024-11-12 02:33:46

51nod 1010 只包含因子2 3 5的数 && poj - 1338 Ugly Numbers(打表)的相关文章

51nod 1010 只包含因子2 3 5的数(打表+排序+二分)

1010 只包含因子2 3 5的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 取消关注 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 <= 1000

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

基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 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 <=

51Nod 1010 只包含因子2 3 5的数 Label:None

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

51NOD 1010 只包含因子2 3 5的数(二分 + 预处理)

传送门 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个数,输出>

51Nod 1010 只包含因子2 3 5的数 | 预处理+二分

Input示例 5 1 8 13 35 77 Output示例 2 8 15 36 80 分析:将所有的只含有2 3 5因子的数打一个表保存在一个数组里,然后二分查找第一个>=数组里的数,输出 #include <bits/stdc++.h> using namespace std; typedef long long LL; #define rep(i,a,n) for(int i = a; i < n; i++) #define repe(i,a,n) for(int i =

1007 正整数分组 1010 只包含因子2 3 5的数 1014 X^2 Mod P 1024 矩阵中不重复的元素 1031 骨牌覆盖

1007 正整数分组 将一堆正整数分为2组,要求2组的和相差最小. 例如:1 2 3 4 5,将1 2 4分为1组,3 5分为1组,两组和相差1,是所有方案中相差最少的. Input 第1行:一个数N,N为正整数的数量. 第2 - N+1行,N个正整数. (N <= 100, 所有正整数的和 <= 10000) Output 输出这个最小差 Input示例 5 1 2 3 4 5 Output示例 1这题不就是小李打怪兽吗,不知道谁模仿谁,呵呵,刚还是我编的题里的,dp,证明一下(要证明什么自

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

个人心得:这题错了很多很多次,一开始单纯是想一直除2,3,5能除尽就可以了,但是数据太大,从第九组数据开始就超时了. 后面听了队友的意见打表,这里用了丑数的思想,就是从2,3,5开始依次取出最小的数分别乘以2,3,5若不存在就放进优先队列, 当然要用set就行存储,s.count()就是查找是否存在的函数,可惜还是超时了,应该是stl中的lower_bound函数效率太低, 没办法就只能用另外的数组存储然后自己根据二分写查找函数,后面对longlong进行适当的输出就过了. 题目: K的因子中只

51nod 1010 stl/数论/二分

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1010 1010 只包含因子2 3 5 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 K的因子中只包含2 3 5.满足条件的前10个数是:2,3,4,5,6,8,9,10,12,15. 所有这样的K组成了一个序列S,现在给出一个数n,求S中 >= 给定数的最小的数. 例如:n = 13,S中 >= 13的最小的数是15,

c语言:把只含因子2、3和5的数称为丑数,求按从小到大的顺序的第1500个丑数(两种方法比较)

把只含因子2.3和5的数称为丑数,求按从小到大的顺序的第1500个丑数.例如6.8都是丑数,但14不是,因为它包含因子7.习惯上把1当作第1个丑数. 算法1:逐个判断每个整数是不是丑数的解法,直观但不够高效 #include<stdio.h> int ugly(int number) { while (number % 2 == 0) { number /= 2; } while (number % 3 == 0) { number /= 3; } while (number % 5 == 0