【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 ...
随机推荐
- 手机APP创建桌面快捷方式
预览: 需要权限: <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT& ...
- IOS RunLoop浅析 二
上一篇我们说了runloop 的几种模式,那么我们在模式中又要做些什么呢??? 模式中有三个模块: 事件源(输入源) Source Source: 按照官方文档分类 Port-Based Custom ...
- [转]CTO、技术总监、首席架构师的区别
经常有创业公司老板来拜访我,常常会拜托给我一句话:帮我找一个CTO. 我解释的多了,所以想把这个写下来,看看你到底需要的应该是啥. 一.高级程序员 如果你是一个刚刚创业的公司,公司没有专职产品经理和项 ...
- Linux安装DBI/DBD-ORACLE
本文只是学习如何配置PERL DBI.PERL DBD时,整理的一个学习实践文档,大部分参考网上资料,详情请见下面参考资料. PERL对数据库的支持广而且全,几乎所有的主流数据库都有与之相应的PERL ...
- BOM与事件
PPK谈JS学习笔记第二弹 JS的语言核心和DOM之间有一个过渡层,一般称为BOM,浏览器对象模型.是指JS的客户端实现,它不操作DOM,又不是JS的语言核心,它的主要功能是管理浏览器窗口,每个窗口都 ...
- 使用VNET-to-VNET连接Microsoft Azure国际版和中国版
Microsoft Azure的VNET-to-VNET功能可以实现跨虚拟网络的VPN连接,通过VNET-to-VNET互联的两个虚拟网络可以在同一个订阅下或者隶属不同的订阅,而且可以跨数据中心.这实 ...
- linux Shell脚本编码格式
在windows下开发,写好的shell脚本,放到linux上执行,往往会因为编码格式的问题存在兼容问题: -bash: ./lbs-circle-server.sh: /bin/sh^M: bad ...
- <<一种基于δ函数的图象边缘检测算法>>一文算法的实现。
原始论文下载: 一种基于δ函数的图象边缘检测算法. 这篇论文读起来感觉不像现在的很多论文,废话一大堆,而是直入主题,反倒使人觉得文章的前后跳跃有点大,不过算法的原理已经讲的清晰了. 一.原理 ...
- 我的第一篇博客/markdown
开通了博客园 使用markdowm Q:为什么考虑使用markdowm而非别的编辑器? 首先,markdowm的优点就不说了, 我是通过http://sspai.com/25137了解了markdow ...
- MyBlog
2016-06-25 一直想在搭建一个自己的blog.说来惭愧,cnblogs中的个人博客虽笔耕不辍,但杂乱无章.然而之前总是嘴上说说.现在,终于要行动起来了. 初步计划: 思路: django + ...