【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-图片旋转
代码: RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController : UIViewControl ...
- Eclipse 常用快捷键 For MAC
Eclipse 常用快捷键 For MAC Option + Command + X: 运行Command + O:显示大纲Command + 1:快速修复Command + D:删除当前行Comma ...
- SDWebImage的使用
- setItem:(CustomItem *)item { _item = item; // 占位图片 UIImage *placeholder = [UIImage imageNamed:@&qu ...
- MVC学习系列2--向Action方法传递参数
首先,新建一个web项目,新建一个Home控制器,默认的代码如下: public class HomeController : Controller { // GET: Home public Act ...
- JAVA中的Fork/Join框架
看了下Java Tutorials中的fork/join章节,整理下. 什么是fork/join框架 fork/join框架是ExecutorService接口的一个实现,可以帮助开发人员充分利用多核 ...
- 聊下 git 使用前的一些注意事项
连接方式https.ssh 在使用git的时候,不管你的服务器是开源平台github还是私服gitlab,你都需要clone仓库到本地,这个clone的时候就需要你选择连接方式.这个连接方式决定了你与 ...
- .NET应用架构设计—用户端的防腐层作用及设计
阅读目录: 1.背景介绍 2.SOA架构下的显示端架构腐化 3.有效使用防腐层来隔离碎片服务导致显示端逻辑腐烂 4.剥离服务调用的技术组件让其依赖接口 5.将服务的DTO与显示端的ViewModel之 ...
- 足球游戏论坛数据分析--简单粗暴的K均值聚类
在<<足球游戏论坛数据分析--简单粗暴的贝叶斯>>中尝试了贴标签后,一直觉得结果无法接受, 慢慢回想, 其实选择的算法是错误的,原因有 论坛帖子分类并非就是PC/PS/XBOX ...
- W3School-CSS 尺寸 (Dimension) 实例
CSS 尺寸 (Dimension) 实例 CSS 实例 CSS 背景实例 CSS 文本实例 CSS 字体(font)实例 CSS 边框(border)实例 CSS 外边距 (margin) 实例 C ...
- ajax缓存问题
默认情况下,请求总会被发出去,但浏览器有可能从它的缓存中调取数据.换句话说,在缓存过期之前,针对相同地址发起的多个Ajax请求,只有第一次会真正发送到服务端.要禁止使用缓存的结果,可以设置 cache ...