注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

TsReaper的博客

一起来玩算法竞赛吧~

 
 
 
 
 

日志

 
 

[题解]又是毕业季II  

2015-08-07 11:23:17|  分类: 题解 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
关键字:因数分解。

Link&Limit


        [洛谷1414]
        时间限制:1000ms  空间限制:131072kb

Background


        “叮铃铃铃”,随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻。毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌。1000多个日夜的欢笑和泪水,全凝聚在毕业晚会上,相信,这一定是一生最难忘的时刻!

Description


        彩排了一次,老师不太满意。当然啦,取每位同学的号数来找最大公约数显然不太合理。于是老师给每位同学评了一个能力值。于是现在问题变为,从n个学生中挑 出k个人使得他们的默契程度(即能力值的最大公约数)最大。但因为节目太多了,而且每个节目需要的人数又不知道。老师想要知道所有情况下能达到的最大默契 程度是多少。这下子更麻烦了,还是交给你吧~
        PS:一个数的最大公约数即本身。

Input Format


        第一行一个正整数n。
        第二行为n个空格隔开的正整数,表示每个学生的能力值。

Output Format


        总共n行,第i行为k=i情况下的最大默契程度。

Sample Input #1


4
1 2 3 4

Sample Output #1


4
2
1
1

Hint


        记输入数据中能力值的最大值为inf。
        对于20%的数据,n<=5,inf<=1000
        对于另30%的数据,n<=100,inf<=10
        对于100%的数据,n<=10000,inf<=1e6
 
        将所有人的能力值进行因数分解,对于k = i,出现次数 ≥ i的因数中的最大因数就是对应解。

#include <stdio.h>
int n,cnt[1000010],f[1000010];
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int i,j,x;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&x);
for(j=1;j*j<x;j++) if(!(x%j)) { cnt[j]++; cnt[x/j]++;}
if(j*j == x) cnt[j]++;
}
for(i=1;i<=1000000;i++) f[cnt[i]] = i;
for(i=n;i;i--) f[i] = max(f[i],f[i+1]);
for(i=1;i<=n;i++) printf("%d\n",f[i]);
return 0;
}

  评论这张
 
阅读(24)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018