【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---设置输入框的光标位置
//这里设置光标位置,让光标位置后移10 textField.leftView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 10, 0)]; tex ...
- SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和 下拉刷新
下拉刷新和上拉刷新都用SwipeRefreshLayout 自带的进度条 布局 <?xml version="1.0" encoding="utf-8"? ...
- iOS 学习 - 16.绘制虚线
//绘制虚线 -(void)set{ UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(, , , )]; [ ...
- Android Studio 导入项目 出现安装Error:Cause: failed to find target with hash string 'android-23' 等错误
今天 在导入 一个新项目时 : 出现了这个错 Error:Cause: failed to find target with hash string 'android-23' in: C:\Use ...
- UITextFeild的用法
一. 修改占位字符串的 颜色: =======方法一 ====================================== #import "ViewController.h&quo ...
- Android Studio连接真机没反应?
刚好遇到这个问题,在网上百度了一下,看到有人分享了引起该问题的几个原因: 手机设置问题.开USB调试 方法: 手机设置 - 开发人员选项 - USB调试 - 勾选 数据线问题. 有的数据线只能用来充电 ...
- 我对uml类图关系的理解
uml类图的关系: 泛化关系也就是继承. 实现关系就是一个类实现另外一个接口. 依赖关系就是一个类使用了另外一个类,是一种使用关系,在这个类的某个服务中需要另外一个类来协助. 关联关系就是一类拥有另外 ...
- 下一代Asp.net开发规范OWIN(1)—— OWIN产生的背景以及简单介绍
随着VS2013的发布,微软在Asp.Net中引入了很多新的特性,比如使用新的权限验证模块Identity, 使用Async来提高Web服务器的吞吐量和效率等.其中一个不得不提的是OWIN和Katan ...
- JVM之CMS收集器
CMS(Concurrent Mark Sweep) 最短回收停顿,适合维持响应时间上的要求. 初始标记 Initial mark:标记GC Roots能够关联到的对象.stop-mark. 并发标记 ...
- x01.TextProc: 两三分钟完成的一个小工具
在工作中,遇到这么个问题,需要将 Excel 表中类似 2134-1234-4456 的商品编号输入到单位的程序中,而程序只认 213412344456 这种没有 ‘-’ 的输入.数量比较多,一笔一笔 ...