USACO 

Humble Numbers

    这题主要是两种做法,第一种是比较常(jian)规(dan)的-------------用pq(priority_queue)维护,每次取堆中最小值(小根堆),用这个值松(mei)弛(ju)一遍所有的素数,大概是O(n*k*logn)的,所以--------闭眼睛T啊!!

    冷静一下,我们来看第二种做法:

  显然,在第一种做法中,我们重复计算了堆中的好多值,而这些我们可以通过记录一个地址来优化。

  我们假设已经求出了前i个丑数,对于第(i+1)个丑数,我们可以枚举所有的素数并且记录这个素数已经枚举到了哪个丑数,这样我们在接下来的求解过程中就不会重复那些当前地址之前的所有丑数。

    附上想丑数一样丑陋的代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
ll a[];
int dis[];
ll ugly[];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
a[]=;
for(int i=;i<=n;i++)
{
scanf("%lld",&a[i]);
}
sort(a+,a+n+);
ugly[]=;
memset(dis,,sizeof(dis));
int minn;
for(int i=;i<=m;i++)
{
minn=n;//记录哪一个值恰好满足条件
for(int j=;j<=n;j++)
{
if(a[j]*ugly[dis[j]]>ugly[i-]&&a[j]*ugly[dis[j]]<a[minn]*ugly[dis[minn]])
minn=j;
}
ugly[i]=a[minn]*ugly[dis[minn]];//更新满足条件者
dis[minn]++;//更新满足条件者
for(int j=;j<=n;j++)
{
while(a[j]*ugly[dis[j]]<ugly[i]) dis[j]++;
if(a[j]*ugly[dis[j]]==ugly[i]) dis[j]++;
}
}
printf("%lld",ugly[m]);
return ;
}

  小结:本题所得到的想法及错误。

      1.没更新主值(ugly);

      2.35行是重要的,因为如果这个素数的地址并没有满足要求,那么它在下一次枚举时会被自动忽略掉,所以我们要将已经Gg的地址更新至可用但不绝对。

      3.dis数组和ugly数组的初值很重要。

  转载请注明:http://www.cnblogs.com/ShuraK/p/7846412.html

  

USACO Humble Numbers的更多相关文章

  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. 洛谷P2723 丑数 Humble Numbers

    P2723 丑数 Humble Numbers 52通过 138提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交  讨论  题解 最新讨论 暂时没有讨论 题目背景 对于一给定的素数 ...

  3. Luogu2723丑数Humble Numbers【归并排序】

    Luogu2723丑数Humble Numbers 题目背景 对于一给定的素数集合 S = {p1, p2, ..., pK},考虑一个正整数集合,该集合中任一元素的质因数全部属于S.这个正整数集合包 ...

  4. 洛谷P2723 丑数 Humble Numbers [2017年 6月计划 数论07]

    P2723 丑数 Humble Numbers 题目背景 对于一给定的素数集合 S = {p1, p2, ..., pK},考虑一个正整数集合,该集合中任一元素的质因数全部属于S.这个正整数集合包括, ...

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

  6. HDU - The number of divisors(约数) about Humble Numbers

    Description A number whose only prime factors are 2,3,5 or 7 is called a humble number. The sequence ...

  7. A - Humble Numbers

    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Pract ...

  8. The number of divisors(约数) about Humble Numbers[HDU1492]

    The number of divisors(约数) about Humble Numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Lim ...

  9. Humble Numbers

    Humble Numbers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9988 Accepted: 4665 Descri ...

随机推荐

  1. 解决Sublime text 3 中文文件名显示方框

    在sublime text 3中,Preference, Settings-User,最后加上一行 "dpi_scale": 1.0 覆盖操作系统设置的DPI. 这是我的Setti ...

  2. apache在window server 2003下的安全配置

    在window server2003下安装apache apache 默认有system权限.所以要先对apache进行降权. 添加用户.我的电脑右击 ->管理->本地用户和组

  3. Oracle 存储过程中的 =>

    oracle实参与形参有两种对应方式1.一种是位置方式,和面向对象语言参数传递类似;2.另外一种是=> 作为形参对应,因为位置对应方法有缺限,比如一个函数有3个参数,但第2个是可以不传(有默认值 ...

  4. directX显示采集源(摄像头)filter

    IGraphBuilder * g_pGraphBuilder = NULL;IBaseFilter *Pbf=0;IVideoWindow  * g_pVWindow = NULL;IMediaCo ...

  5. Caused by:java.sql.SQLException:ORA-00923

    1.错误描述 Caused by:java.sql.SQLException:ORA-00923:未找到要求的FROM关键字 2.错误原因 拼接SQL语句时缺少FROM什么表,导致出错 3.解决办法 ...

  6. python datetime 与 time模块

    time模块 tmie.strptime :将时间字符串转化为时间类型 格式:time.strptime(string[string[, format]) 结果可以利用利用time.tm_year 返 ...

  7. freemarker中的split字符串分割(十六)

    1.简易说明 split分割:用来根据另外一个字符串的出现将原字符串分割成字符串序列 2.举例说明 <#--freemarker中的split字符串分割--> <#list &quo ...

  8. Java虚拟机的锁优化

    1 锁偏向.当现成请求一个对象锁时,如果获得锁,则该对象锁进入偏向模式,当该线程再次请求该对象的锁时,无需再做任何同步操作. 可通过在Java虚拟机中开启参数-XX:+UseBasedLock开启偏向 ...

  9. BZOJ 1079: [SCOI2008]着色方案(巧妙的dp)

    BZOJ 1079: [SCOI2008]着色方案(巧妙的dp) 题意:有\(n\)个木块排成一行,从左到右依次编号为\(1\)~\(n\).你有\(k\)种颜色的油漆,其中第\(i\)种颜色的油漆足 ...

  10. 【BZOJ1012】【JSOI2008】最大数(线段树)

    [JSOI2008]最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:L不超过当前 ...