zoukankan      html  css  js  c++  java
  • [POJ1338]Ugly Numbers

    [POJ1338]Ugly Numbers

    试题描述

    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, ... 
    shows the first 10 ugly numbers. By convention, 1 is included. 
    Given the integer n,write a program to find and print the n'th ugly number.

    输入

    Each line of the input contains a postisive integer n (n <= 1500).Input is terminated by a line with n=0.

    输出

    For each line, output the n’th ugly number .:Don’t deal with the line with n=0.

    输入示例

    1
    2
    9
    0

    输出示例

    1
    2
    10

    数据规模及约定

    见“输入

    题解

    首先与处理一下前 1500 个“丑数”,建立一个堆,对于一个“丑数” x,我们把 x * 2, x * 3, x * 5 都扔进堆,输出一下发现居然没有爆 unsigned long long(事实上连 int 都没爆),所以就是思博题了。

    查询就访问数组即可。

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <stack>
    #include <vector>
    #include <queue>
    #include <cstring>
    #include <string>
    #include <map>
    #include <set>
    using namespace std;
    
    const int BufferSize = 1 << 16;
    char buffer[BufferSize], *Head, *Tail;
    inline char Getchar() {
        if(Head == Tail) {
            int l = fread(buffer, 1, BufferSize, stdin);
            Tail = (Head = buffer) + l;
        }
        return *Head++;
    }
    int read() {
        int x = 0, f = 1; char c = Getchar();
        while(!isdigit(c)){ if(c == '-') f = -1; c = Getchar(); }
        while(isdigit(c)){ x = x * 10 + c - '0'; c = Getchar(); }
        return x * f;
    }
    
    #define maxn 1510
    #define ULL unsigned long long
    int n;
    ULL num[maxn];
    priority_queue <ULL> Q;
    
    int main() {
    	num[1] = 1;
    	Q.push(-2ll); Q.push(-3ll); Q.push(-5ll);
    	for(int i = 2; i <= 1500; i++) {
    		num[i] = -Q.top(); Q.pop();
    		while(num[i] == num[i-1]) num[i] = -Q.top(), Q.pop();
    		Q.push(-(num[i] << 1ll)); Q.push(-num[i] * 3ll); Q.push(-num[i] * 5ll);
    	}
    	
    	while(1) {
    		n = read();
    		if(!n) break;
    		printf("%llu
    ", num[n]);
    	}
    	
    	return 0;
    }
    
  • 相关阅读:
    Mysql常用sql语句(18)- union 全连接
    Mysql常用sql语句(17)- left / right join 外连接
    Mysql常用sql语句(16)- inner join 内连接
    Mysql常用sql语句(15)- cross join 交叉连接
    Mysql常用sql语句(14)- 多表查询
    PAT甲级专题|链表
    编程范式|程序世界里的编程范式,探索语言本质
    PAT甲级专题|树的遍历
    Java学习路线|转至CodeSheep
    SQL必知必会|SQL基础篇
  • 原文地址:https://www.cnblogs.com/xiao-ju-ruo-xjr/p/5803054.html
Copyright © 2011-2022 走看看