USACO3.1Humble Numbers[...]
题目背景
对于一给定的素数集合 S = {p1, p2, ..., pK},考虑一个正整数集合,该集合中任一元素的质因数全部属于S。这个正整数集合包括,p1、p1*p2、p1*p1、p1*p2*p3...(还有其它)。该集合被称为S集合的“丑数集合”。注意:我们认为1不是一个丑数。
题目描述
你的工作是对于输入的集合S去寻找“丑数集合”中的第N个“丑数”。所有答案可以用longint(32位整数)存储。
补充:丑数集合中每个数从小到大排列,每个丑数都是素数集合中的数的乘积,第N个“丑数”就是在能由素数集合中的数相乘得来的(包括它本身)第n小的数。
输入输出格式
输入格式:
第 1 行: 二个被空格分开的整数:K 和 N , 1<= K<=100 , 1<= N<=100,000.
第 2 行: K 个被空格分开的整数:集合S的元素
输出格式:
单独的一行,输出对于输入的S的第N个丑数。
输入输出样例
4 19
2 3 5 7
27
---------------------------------------------------------------------------------------------------------------
分析:对于一个丑数,很明显是比它小的丑数*S中一个数
法一:最小堆
先认为1是丑数,推入1;
弹出堆顶tmp,推入tmp*S中每个元素【判重判重判重】
n+1次弹出就是ans
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
typedef long long ll;
const ll N=1e5+,K=;
ll n,k,a[K],ans[N],cnt=;
priority_queue<ll,vector<ll>,greater<ll> > q;
int main(){
cin>>k>>n;
for(ll i=;i<=k;i++){scanf("%d",&a[i]);}
q.push();
while(cnt<=n){
ll tmp=q.top();q.pop();
if(ans[cnt]<tmp){ //repeat
ans[++cnt]=tmp;
for(int i=;i<=k;i++)q.push(a[i]*tmp);
}
}
cout<<ans[n+];
}
然而会TLE一个点
法二:
对于ans[i],是a[j]*ans[t]:t<i中大于ans[i-1]且最小的一个
维护一个s[j]是a[j]*ans[s[j]]>f[i-1]最小的t
然后就很愉快了
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
const ll N=1e5+,K=,INF=1e10;
ll n,k,ans[N],a[K],s[N];
int main(){
cin>>k>>n;
for(ll i=;i<=k;i++) scanf("%d",&a[i]); ans[]=;
for(ll i=;i<=n;i++){
ll now=INF;
for(ll j=;j<=k;j++){
while(a[j]*ans[s[j]]<=ans[i-]) s[j]++;//维护s[j]
now=min(now,a[j]*ans[s[j]]);//更新f[i]
}
ans[i]=now;
}
cout<<ans[n];
}
USACO3.1Humble Numbers[...]的更多相关文章
- Java 位运算2-LeetCode 201 Bitwise AND of Numbers Range
在Java位运算总结-leetcode题目博文中总结了Java提供的按位运算操作符,今天又碰到LeetCode中一道按位操作的题目 Given a range [m, n] where 0 <= ...
- POJ 2739. Sum of Consecutive Prime Numbers
Sum of Consecutive Prime Numbers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20050 ...
- [LeetCode] Add Two Numbers II 两个数字相加之二
You are given two linked lists representing two non-negative numbers. The most significant digit com ...
- [LeetCode] Maximum XOR of Two Numbers in an Array 数组中异或值最大的两个数字
Given a non-empty array of numbers, a0, a1, a2, … , an-1, where 0 ≤ ai < 231. Find the maximum re ...
- [LeetCode] Count Numbers with Unique Digits 计算各位不相同的数字个数
Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n. Examp ...
- [LeetCode] Bitwise AND of Numbers Range 数字范围位相与
Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers ...
- [LeetCode] Valid Phone Numbers 验证电话号码
Given a text file file.txt that contains list of phone numbers (one per line), write a one liner bas ...
- [LeetCode] Consecutive Numbers 连续的数字
Write a SQL query to find all numbers that appear at least three times consecutively. +----+-----+ | ...
- [LeetCode] Compare Version Numbers 版本比较
Compare two version numbers version1 and version1.If version1 > version2 return 1, if version1 &l ...
随机推荐
- 用Phaser来制作一个html5游戏——flappy bird (一)
Phaser是一个简单易用且功能强大的html5游戏框架,利用它可以很轻松的开发出一个html5游戏.在这篇文章中我就教大家如何用Phaser来制作一个前段时间很火爆的游戏:Flappy Bird,希 ...
- go语言选择语句 switch case
根据传入条件的不同,选择语句会执行不同的语句.下面的例子根据传入的整型变量i的不同而打印不同的内容: switch i { case 0: fmt.Printf("0") case ...
- [DeviceOne开发]-白板的示例
一.简介 该demo通过do_Painterview这个组件实现画板的基本功能,模仿的是Appstore上的叫“白板”的应用,可以更改字体颜色,字体粗细,然后用手指进行绘制,可以回退,清屏,保存到相册 ...
- git node(&npm)安装
1.git 下载地址:https://git-scm.com/download/win 2.node 下载地址:https://nodejs.org/en/download/ 安装node会自带npm ...
- No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386)
今天在运行一个老ios项目的时候,突然报错:No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VAL ...
- 【代码笔记】iOS-两个时间字符串的比较
一,效果图. 二,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the ...
- ajax异步上传到又拍云的实例教程
作者:白狼 出处:www.manks.top/article/async_upload_to_upyun 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否 ...
- MYSQL数据回流
一般的网站应用中,总会有部分二次数据(处理过的原始数据)展现给前台,比如,拿购物网站来说,购买进口奶粉最多的用户群体:哪类产品消费增长趋势最旺盛:用户的消费历史归类等都是二次数据.由于这部分 ...
- JSON格式互转集合
在工作中我们经常会遇到格式转换的问题,有的时候是将JSON转换成DataTable.DataSet或是List等,也有可能将DataTable.DataSet或是List转换成JSON的,抽了点时间把 ...
- SQL Server 使用游标更新数据库中的数据(使用存储过程)
ALTER PROCEDURE [dbo].[POR_CURSOR_FOR_UPDATE] --创建存储过程 AS BEGIN SET nocount ON --忽略行数显示 DECLARE Upda ...