题意:给你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大的数)的更多相关文章

  1. 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 ...

  2. HDU 1058 Humble Numbers(离线打表)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1058 解题报告:输入一个n,输出第n个质因子只有2,3,5,7的数. 用了离线打表,因为n最大只有58 ...

  3. USACO Humble Numbers

    USACO  Humble Numbers 这题主要是两种做法,第一种是比较常(jian)规(dan)的-------------用pq(priority_queue)维护,每次取堆中最小值(小根堆) ...

  4. 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, ...

  5. 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 ...

  6. HDU 4320 Arcane Numbers 1(质因子包含)

    http://acm.hdu.edu.cn/showproblem.php?pid=4320 题意: 给出A,B,判断在A进制下的有限小数能否转换成B进制下的有限小数. 思路: 这位博主讲得挺不错的h ...

  7. POJ1142 Smith Numbers 暴力+分解质因子

    题意:题目定义了一个史密斯数,这个数的定义是:一个合数的各个位置上加起来的和等于它的素因数所有位置上的数字加起来的和.比如: 4937775=3∗5∗5∗658374+9+3+7+7+7+5=3+5+ ...

  8. Humble Numbers(丑数) 超详解!

    给定一个素数集合 S = { p[1],p[2],...,p[k] },大于 1 且素因子都属于 S 的数我们成为丑数(Humble Numbers or Ugly Numbers),记第 n 大的丑 ...

  9. [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 ...

随机推荐

  1. UILabel

    //UILabel->UIView /* 1.实例化 2.属性 3.添加到父视图上 */ //实例化 UILabel *label = [[UILabel alloc] initWithFram ...

  2. 初学HTML 常见的标签(二) 列表标签

    上次介绍了一些简单的文本标签设计, 这篇介绍列表类标签, 通过列表能写出很好看的, 多元化的网络页面. ul-li 列表标签 <ul> <li>列表1</li> & ...

  3. Linux - expect自动化远程登录脚本

    简单模式: #!/usr/bin/expect -f spawn ssh root@192.168.0.1 expect "*assword*" send "root\r ...

  4. Play Framework 完整实现一个APP(三)

    1.添加Post类 package models; import java.util.*; import javax.persistence.*; import play.db.jpa.*; @Ent ...

  5. [Erlang 0108] Elixir 入门

    Erlang Resources里面关于Elixir的资料越来越多,加上Joe Armstrong的这篇文章,对Elixir的兴趣也越来越浓厚,投入零散时间学习了一下.零零散散,测试代码写了一些,Ev ...

  6. You must use the Role Management Tool to install or configure Microsoft .NET Framework 3.5 SP1

    今天在Windows Server 2008 下安装SQL SERVER 2008时,碰到如下错误: You must use the Role Management Tool to install ...

  7. 廖雪峰python教程的第一个疑问

    函数的参数一节中提到: def add_end(L = []); L.append('END') return L 正常调用add_end时(也就是有参数传入时): >>> add_ ...

  8. Navicat安装详解

    本文章介绍MySql图形化操作软件Navicat的安装 属于PHP环境搭建的一部分. PHP完整配置信息请参考 http://www.cnblogs.com/azhe-style/p/php_new_ ...

  9. NOIP2008双栈排序[二分图染色|栈|DP]

    题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...

  10. Eclipse使用svn文章列表

    http://www.cnblogs.com/duanxz/p/3334660.html http://www.cnblogs.com/duanxz/p/3334660.html http://130 ...