UVA_136 Ugly Numbers ( priority_queue 的应用 )

题解

	自定义一下优先队列的优先级 , 为了题目要求的从小到大顺序 , 重载为小的优先出来 
	下面分析一下丑数是什么 , 丑数定义是不能被 2 , 3 , 5 整除的数  , 也就是说 !!! 丑数就是 2 
, 3 , 5 的倍数 ! 需要注意这里绕了一个弯 . 
	那既然是这三个数的倍数了 , 那就将这三个数存到一个数组 , 优先队列每次出队都是一个最小的数 , 
这个数挨着和这三个数相乘再压入优先队列 , 压入队列的时候还需要注意一下 , 可能会有重复的数字 , 
这时候需要一个set 来去重 , 如果没重复再压 ,  外部for循环控制次数 , i == 1500 的时候 break 
, 输出即可. 

代码


#include <bits/stdc++.h> 
using namespace std ; 
#define rg register 
typedef long long ll ; 



int main ( ) {  

    const int tb[3] = { 2 , 3 , 5 } ; 
    priority_queue< ll ,  vector<ll> , greater<ll> > q ; // 小的优先出来 
    set<int> s ; 
    q.push(1) ; 
    s.insert(1) ; 

    for( rg int i = 1 ; ; ++i ) { 
        ll x = q.top() ; 
        q.pop() ; 
        if ( i == 1500 ) { 
            cout << "The 1500'th ugly number is " << x << "." << endl ;  
            break ; 
        }

        for ( rg int j = 0 ; j < 3 ; ++j ) { 
            ll t = x*tb[j] ; 
            if ( !s.count(t) ) { 
                s.insert( t ) , 
                q.push( t ) ; 
            }
        }
    }


    return 0 ; 
} 

题目

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值