hdu1058丑数(优先队列、暴力打表)

hdu1058

题意:当一个数只有2、3、5、7这四种质因数时(也可以一种都没有或只有其中几种),这个数就是丑数,输出第 n 个丑数是多少;

其实并没有发现hdu把这道题放在 dp 专题里的意图,我的思路就是预处理出丑数数组,然后读入 n 就直接输出第 n 个丑数。我自己又一种想法,询问翔神之后又学到了另一种做法。

我自己的生成数组的方法是:数组的第一个元素定为1,然后用优先队列,首先将2,3,5,7放入优先队列,每次从队列中取出最小的一个数,将它放入数组中,然后分别将它乘上2,3,5,7后放入优先队列中,这样重复直到从队列中取出的数大于2000000000的时候就结束。对于处理重复元素,只要将优先队列中拿出的元素与数组中的上一次放入的数比较,如果相等就不进行操作,若不等则进行操作,这样就可以了。

 1 #include<stdio.h>
 2 #include<queue>
 3 using namespace std;
 4 #define LL long long
 5 LL hum[10000],count=1;
 6
 7 void init(){
 8 //    printf("1111111111");
 9     priority_queue<LL ,vector<LL>,greater<LL> >q;
10     q.push(2);
11     q.push(3);
12     q.push(5);
13     q.push(7);
14     hum[1]=1;
15     LL a=q.top();
16     q.pop();
17
18     while(a<=2000000000){
19         if(a!=hum[count]){
20             hum[++count]=a;
21             q.push(a*2);
22             q.push(a*3);
23             q.push(a*5);
24             q.push(a*7);
25         }
26         a=q.top();
27         q.pop();
28     }
29     return;
30 }
31
32 int main(){
33 //    printf("1111111111");
34     init();
35     int n;
36     while(scanf("%d",&n)!=EOF&&n!=0){
37         printf("The %d",n);
38         if(n%100==11||n%100==12||n%100==13)printf("th ");
39         else if(n%10==1)printf("st ");
40         else if(n%10==2)printf("nd ");
41         else if(n%10==3)printf("rd ");
42         else printf("th ");
43         printf("humble number is %lld.\n",hum[n]);
44     }
45     return 0;
46 }

翔神告诉我另一种做法,首先数组 hum[10000] 第一个元素还是1,然后定 a2 , a3 , a5 , a7 四个数分别表示 2 3 5 7 接下来要乘的数组元素的下标,起始都为 1 ,分别比较 2 * hum [ a2 ] , 3* hum [ a3 ] ,5 * hum [ a5 ] ,7 * hum [ a7 ] ,最小的一个放入数组,并将其对应的数组下标 a几 ++,重复直到超过2000000000

 1 #include<stdio.h>
 2 #define LL long long
 3 LL hum[10000];
 4
 5 void init(){
 6     hum[1]=1;
 7     LL a2=1,a3=1,a5=1,a7=1,count=1;
 8     while(hum[count]<2000000000){
 9         LL min=3000000000;
10         if(2*hum[a2]<min)min=2*hum[a2];
11         if(3*hum[a3]<min)min=3*hum[a3];
12         if(5*hum[a5]<min)min=5*hum[a5];
13         if(7*hum[a7]<min)min=7*hum[a7];
14         hum[++count]=min;
15         if(2*hum[a2]==min)a2++;
16         if(3*hum[a3]==min)a3++;
17         if(5*hum[a5]==min)a5++;
18         if(7*hum[a7]==min)a7++;
19     }
20     return;
21 }
22
23 int main(){
24     init();
25     int n;
26     while(scanf("%d",&n)!=EOF&&n!=0i){
27         printf("The %d",n);
28         if(n%100==11||n%100==12||n%100==13)printf("th ");
29         else if(n%10==1)printf("st ");
30         else if(n%10==2)printf("nd ");
31         else if(n%10==3)printf("rd ");
32         else printf("th ");
33         printf("humble number is %lld.\n",hum[n]);
34     }
35     return 0;
36 }

时间: 2024-08-06 11:58:26

hdu1058丑数(优先队列、暴力打表)的相关文章

hdu1058 Humble Numbers(丑数)

丑数:只包含一定的质因子的数称丑数,例如包含2,3,5.我们就把2,3,4,5,6,8,9,10,12,15........但我们通常把1称作为第一个丑数. 解题思路:我们现在做的这道题,就是以2,3,5,7为质因子,要我们求第n个丑数(以1为第一个丑数),可以采用DP的思想来解决.我们先以array[1]=1为基础,在它乘以质因子取得最小的数为有序数组的第二个,然后依次类推.写出状态转移方程:array[n] = Min(array[n2]*2, array[n3]*3, array[n5]*

UVA - 136 Ugly Numbers(丑数,STL优先队列+set)

Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, ... shows the first 11 ugly numbers. By convention, 1 is included. Write a program to find and print the 1500'th ugly number. Input Ther

洛谷P2723 丑数 Humble Numbers

P2723 丑数 Humble Numbers 52通过 138提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交  讨论  题解 最新讨论 暂时没有讨论 题目背景 对于一给定的素数集合 S = {p1, p2, ..., pK},考虑一个正整数集合,该集合中任一元素的质因数全部属于S.这个正整数集合包括,p1.p1*p2.p1*p1.p1*p2*p3...(还有其它).该集合被称为S集合的“丑数集合”.注意:我们认为1不是一个丑数. 题目描述 你的工作是对于输入的集合S去寻找

hdu 1431 素数回文(暴力打表,埃托色尼筛法)

这题开始想时,感觉给的范围5 <= a < b <= 100,000,000太大,开数组肯定爆内存,而且100000000也不敢循环,不超时你打我,反正我是不敢循环. 这题肯定得打表,筛素数肯定用埃托色尼筛法(不好意思把大名鼎鼎的埃拉托色尼名字打错了,表打我). 再看当你所找的回文数的位数为偶数时,有如下定理除11外所有偶数位数的回文数都能被11整除,所以所有偶数位数的回文都不是素数. 证明看如下(我手写的) 手机像素渣(凑活着吧)字丑也凑和着. 证完后我们在来说题目给的数据范围 所以当

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

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

LeetCode——264. 丑数 II

编写一个程序,找出第 n 个丑数. 丑数就是只包含质因数 2, 3, 5 的正整数. 示例: 输入: n = 10 输出: 12 解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数. 说明: 1 是丑数. n 不超过1690. 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/ugly-number-ii 1.暴力(brute force) class Solution { public: int nth

丑数 uva-136 丑数

代码如下: /*丑数是指不能被2.3.5以外的其他素数整除的数,把丑数从小到大排列起来,结果如下: 1,2,3,4,5,6,8,9,10,12,15... 求出第1500个丑数. */ #include<iostream> #include<vector> #include<queue> #include<set> using namespace std; typedef long long LL; int su[3]={2,3,5}; int main()

NYOJ1097 Ugly Numbers 【丑数】

Ugly Numbers 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, ... shows the first 11 ugly numbers. By convention, 1 is included. Now give you need

HDU 5179 beautiful number (数位dp / 暴力打表 / dfs)

beautiful number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 801    Accepted Submission(s): 518 Problem Description Let A=∑ni=1ai?10n?i(1≤ai≤9)(n is the number of A's digits). We call A as "