【USACO 3.1】Humble Numbers(给定质因子组成的第n大的数)
题意:给你k(≤100)个质数,求质因子只包含它们的第n大的数。
题解:
方法一:维护一个数组,一开始只有给出的质数在里面,用每个质数去乘以数组中每个数,然后归并排序,长度保留到n,一轮接一轮,直到乘出来的新出现的数大于原来最大的数,那么如果当前是用最小的质数都没产生新的前n大的数,那么第n个数就是第n大的数。否则跳转到用最小的质数去乘。具体见代码。
/*
TASK: humble
LANG: C++
*/
#include<cstdio>
#include<algorithm>
#include<iostream>
#define N 100005
#define ll long long
using namespace std;
int n,k,p[N];
ll a[N],b[N],c[N];
bool merge(ll a[],ll b[]){
bool f=;
for(int k=,i=,j=;k<=n;k++)
if(!b[j]||a[i]&&a[i]<=b[j]){
c[k]=a[i];
if(a[i]==b[j])j++;
i++;
}else{
f=;
c[k]=b[j];
j++;
}
for(int i=;i<=n&&c[i];i++)a[i]=c[i];
return f;
}
ll solve(){
while(){
for(int i=;i<=k;i++){
for(int j=;j<=n;j++){
a[j]=p[i]*b[j];
if(b[j]==||b[n]&&a[j]>b[n])break;
}
if(!merge(b,a)){
if(i==)return b[n];
else i=;
}
}
}
}
int main(){
freopen("humble.in","r",stdin);
freopen("humble.out","w",stdout);
scanf("%d%d",&k,&n);
for(int i=;i<=k;i++){
scanf("%d",&p[i]);
b[i]=p[i];
}
printf("%d\n",solve());
return ;
} /*
Test 1: TEST OK [0.000 secs, 6912 KB]
Test 2: TEST OK [0.000 secs, 6912 KB]
Test 3: TEST OK [0.000 secs, 6912 KB]
Test 4: TEST OK [0.011 secs, 6912 KB]
Test 5: TEST OK [0.043 secs, 6912 KB]
Test 6: TEST OK [0.151 secs, 6912 KB]
Test 7: TEST OK [0.032 secs, 6912 KB]
Test 8: TEST OK [0.032 secs, 6912 KB]
Test 9: TEST OK [0.000 secs, 6912 KB]
Test 10: TEST OK [0.000 secs, 6912 KB]
Test 11: TEST OK [0.000 secs, 6912 KB]
Test 12: TEST OK [0.205 secs, 6912 KB]
*/
方法二:用set,对于每个质数,与set中最小的的乘积插入set,set中维护至多n个元素,然后迭代器后移,直到乘出来的数比最大的数还大或者超出long long就跳出,set中第n个即最大的就是答案。
/*
TASK: humble
LANG: C++
*/
#include<cstdio>
#include<algorithm>
#include<iostream>
#define N 105
#define ll long long
#include<set>
using namespace std;
int n,k,p[N];
set<ll>s;
int main(){
freopen("humble.in","r",stdin);
freopen("humble.out","w",stdout);
cin>>k>>n;
for(int i=;i<=k;i++){
cin>>p[i];
s.insert(p[i]);
}
set<ll>::iterator it;
for(int i=;i<=k;i++){
it=s.begin();
while(){
ll t=*it*p[i];
if(t<)break;
if(s.size()>n){
s.erase(--s.end());
if(t>(*--s.end()))break;
}
s.insert(t);
it++;
}
}
cout<<*(--s.end())<<endl;
return ;
}
/*
Test 1: TEST OK [0.000 secs, 4184 KB]
Test 2: TEST OK [0.000 secs, 4184 KB]
Test 3: TEST OK [0.000 secs, 4184 KB]
Test 4: TEST OK [0.011 secs, 4448 KB]
Test 5: TEST OK [0.032 secs, 4844 KB]
Test 6: TEST OK [0.151 secs, 7220 KB]
Test 7: TEST OK [0.043 secs, 5108 KB]
Test 8: TEST OK [0.032 secs, 4976 KB]
Test 9: TEST OK [0.000 secs, 4184 KB]
Test 10: TEST OK [0.000 secs, 4184 KB]
Test 11: TEST OK [0.000 secs, 4184 KB]
Test 12: TEST OK [0.216 secs, 7220 KB] */
方法三:超时一个点。用优先队列的小根堆即
priority_queue<ll,vector<ll>,greater<ll> >q;
每次用队首乘上每个质数并插入小根堆,并队首出队。第n个出队的就是答案,并且要进行判重,t=q.top()*p[j]; if(ans[i]<t){ans[++i]=t;...}。
方法四:官方题解,用d[i]记录第i个质数要乘到第几个丑数,每次把每个质数和要乘的丑数的乘积的最小值作为新加的丑数,每个质数要乘的丑数就是满足和它相乘后,比最后一个丑数大的最小的丑数。
/*
TASK: humble
LANG: C++
*/
#include<cstdio>
#include<algorithm>
#include<iostream>
#define N 100005
#define ll long long
using namespace std;
int n,k,p[];
ll hum[N],d[N];
int main(){
freopen("humble.in","r",stdin);
freopen("humble.out","w",stdout);
scanf("%d%d",&k,&n);
for(int i=;i<=k;i++)
scanf("%d",&p[i]);
hum[]=;
for(int i=;i<=n;i++){
ll m=hum[i-]*p[];
for(int j=;j<=k;j++){
while(hum[d[j]]*p[j]<=hum[i-])d[j]++;
if(m>hum[d[j]]*p[j])m=hum[d[j]]*p[j];
}
hum[i]=m;
}
printf("%lld\n",hum[n]);
return ;
}
/*
Test 1: TEST OK [0.000 secs, 5740 KB]
Test 2: TEST OK [0.000 secs, 5740 KB]
Test 3: TEST OK [0.000 secs, 5740 KB]
Test 4: TEST OK [0.000 secs, 5740 KB]
Test 5: TEST OK [0.000 secs, 5740 KB]
Test 6: TEST OK [0.022 secs, 5740 KB]
Test 7: TEST OK [0.000 secs, 5740 KB]
Test 8: TEST OK [0.000 secs, 5740 KB]
Test 9: TEST OK [0.000 secs, 5740 KB]
Test 10: TEST OK [0.000 secs, 5740 KB]
Test 11: TEST OK [0.000 secs, 5740 KB]
Test 12: TEST OK [0.108 secs, 5740 KB]
*/
【USACO 3.1】Humble Numbers(给定质因子组成的第n大的数)的更多相关文章
- USACO 3.1 Humble Numbers
Humble Numbers For a given set of K prime numbers S = {p1, p2, ..., pK}, consider the set of all num ...
- HDU 1058 Humble Numbers(离线打表)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1058 解题报告:输入一个n,输出第n个质因子只有2,3,5,7的数. 用了离线打表,因为n最大只有58 ...
- USACO Humble Numbers
USACO Humble Numbers 这题主要是两种做法,第一种是比较常(jian)规(dan)的-------------用pq(priority_queue)维护,每次取堆中最小值(小根堆) ...
- HDU-1492-The number of divisors(约数) about Humble Numbers -求因子总数+唯一分解定理的变形
A number whose only prime factors are 2,3,5 or 7 is called a humble number. The sequence 1, 2, 3, 4, ...
- Codeforces Round #828 (Div. 3) E2. Divisible Numbers (分解质因子,dfs判断x,y)
题目链接 题目大意 给定a,b,c,d四个数,其中a<c,b<c,现在让你寻找一对数(x,y),满足一下条件: 1. a<x<c,b<y<d 2. (x*y)%(a ...
- HDU 4320 Arcane Numbers 1(质因子包含)
http://acm.hdu.edu.cn/showproblem.php?pid=4320 题意: 给出A,B,判断在A进制下的有限小数能否转换成B进制下的有限小数. 思路: 这位博主讲得挺不错的h ...
- POJ1142 Smith Numbers 暴力+分解质因子
题意:题目定义了一个史密斯数,这个数的定义是:一个合数的各个位置上加起来的和等于它的素因数所有位置上的数字加起来的和.比如: 4937775=3∗5∗5∗658374+9+3+7+7+7+5=3+5+ ...
- Humble Numbers(丑数) 超详解!
给定一个素数集合 S = { p[1],p[2],...,p[k] },大于 1 且素因子都属于 S 的数我们成为丑数(Humble Numbers or Ugly Numbers),记第 n 大的丑 ...
- [poj2247] Humble Numbers (DP水题)
DP 水题 Description A number whose only prime factors are 2,3,5 or 7 is called a humble number. The se ...
随机推荐
- IOS开发基础知识--碎片7
三十八:各个版本IPHONE分辨率及图片的实现原理 desert@2x : iPhone 4s ( x ) desert-568h@2x : iPhones , 5C and 5S ( x ) des ...
- Reporting Services 错误案例一则
遇到一个有意思的Reporting Services报表的案例,在2015-01-30号的凌晨20分左右的时候,有人发现Reporting Services的速度非常慢,而且最后有抛出异常,当时不知道 ...
- SQL SERVER导出特殊格式的平面文件
有时候我们需要将SQL SERVER的数据一次性导入到ORACLE中,对于数据量大的表.我一般习惯先从SQL SERVER导出特殊格式的平面文件(CSV或TXT),然后用SQL*Loader装载数据到 ...
- python 常用模块之os、sys、shutil
目录: 1.os 2.sys 3.shutil 一.os模块 说明:os模块是对操作系统进行调用的接口 os.getcwd() #获取当前工作目录,即当前python脚本工作的目录路径 os.chdi ...
- MySQL InnoDB表--BTree基本数据结构
MySQL InnoDB表是索引组织表这一点应该是每一个学习MySQL的人都会首先学到的知识,这代表这表中的数据是按照主键顺序存储,也就是说BTree的叶子节点存储了所有该行的数据. 我最开始是搞Or ...
- Linux下通配符总结
* - 通配符,代表任意字符(0到多个)? - 通配符,代表一个字符# - 注释/ - 跳转符号,将特殊字符或通配符还原成一般符号| - 分隔两个管线命令的界定; - 连续性命令的界定~ - 用户的根 ...
- Useful commmands in Gentoo
Safe way to upgrade: emerge --sync & eix-sync emerge -avuDN --with-bdeps y --keep-going world et ...
- 【小白的CFD之旅】05 补充基础
黄师姐是一个很干脆果敢的人,从她的日常装扮就能显露出来.卡帕运动装,白色运动鞋,马尾辫,这是小白对黄师姐的第一印象.“明天早上九点钟来实验室,我给你安排这阵子的任务.”黄师姐对小白说.说话语气和老蓝一 ...
- [WPF系列]-数据邦定之DataTemplate 对 ItemsControl 进行样式和模板处理
引言 即使 ItemsControl 不是 DataTemplate 所用于的唯一控件类型,将 ItemsControl 绑定到集合仍然很常见. 在 DataTemplate 中有哪些内容一节中, ...
- Oracle数据库语言——结构化查询语言SQL
一.数据定义语言DDL 1.创建表空间:CREAT TABLESPACE lyy DATAFILE 'C:/app/lyy.dbf' SIZE 10M;(创建一个10M的表空间,存放在C盘app文件夹 ...