hihocoder 1165 : 益智游戏
描述
幽香今天心情不错,正在和花田里的虫子玩一个益智游戏。
这个游戏是这样的,对于一个数组A,幽香从A中选择一个数a,虫子从A中选择一个数b。a和b可以相同。她们的分数是a*b的因子的个数。
幽香和虫子当然想要获得尽可能的高的分数,你能告诉她们应该选择哪两个数吗。
由于幽香是个非常随意的人,数组A中的元素都是她随机选择的。
输入
一行一个数n,表示A中整数的数量。
接下来一行n个数,分别表示a1,a2,...,an,为A中的元素。
n <= 100000, 1 <= ai <= 100000
保证所有的ai都是随机生成的。
输出
一行表示最大的分数。
怎么想都没有啥算法,其实正确的暴力姿势也能出奇迹。
刚开始只想到我们求得每个数的因子个数b[i],对然后巧用break;能混过去;
这种形式:if (ans>b[i]*b[j]) break 一层循环,b数组是按照 因子个数从大到小 排序,所以正确。
但是 我们每次算(a[i],a[j])的因子个数总和时还要 一步一步枚举过去,TLE。
比如这段代码:
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string.h>
#include<string> using namespace std; #define N 100001 int p[N];
int b[N],t; struct node
{
int x,y;
}a[N];
void prime()
{
for (int i=2;i<N;i++)
if (!b[i])
for (int j=i+i;j<N;j+=i)
b[j]=1; for (int i=2;i<N;i++)
if (!b[i]) p[++t]=i;
} int work(int x,int y)
{
int sum=1;
int t=1;
while (1)
{
if (x==1&&y==1) return sum;
int v=1;
if (x%p[t]==0)
{
while (x%p[t]==0)
{
v++;
x/=p[t];
}
}
if (y%p[t]==0)
{
while (y%p[t]==0)
{
v++;
y/=p[t];
}
}
t++;
sum*=v;
}
} int cmp(node a,node b)
{
return a.y>b.y;
} int main()
{
prime(); memset(b,0,sizeof(b));
int n;
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&a[i].x),a[i].y=work(a[i].x,1);
//for (int i=1;i<=n;i++) printf("%d ",a[i].y);
sort(a+1,a+n+1,cmp);
int ans=0;
for (int i=1;i<=n;i++)
for (int j=i+1;j<=n;j++){
if (ans>a[i].y*a[j].y) break;
else ans=work(a[i].x,a[j].x);
} printf("%d\n",ans);
return 0;
}
于是看到一个模板:线性帅法,并且每次能求出一个数的前驱素数因子
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string.h>
#include<string> using namespace std; #define N 100001 int p[N];
int b[N],t=; struct node
{
int x,y;
}a[N];
void prime()
{
for (int i=;i<N;i++)
{
if (!b[i]) p[++t]=b[i]=i;
for (int j=;j<=t&&p[j]<=b[i]&&p[j]<=N/i;++j) b[i*p[j]]=p[j];
}
b[]=N;
} int work(int x,int y)
{
int sum=;
int c=;
while (x>||y>)
{
if (b[x]<b[y]) c=b[x];
else c=b[y];
int v=;
for (;b[x]==c;x/=c) v++;
for (;b[y]==c;y/=c) v++;
sum*=v;
}
return sum;
}
inline int cmp(node a,node b)
{
return a.y>b.y;
} int main()
{
prime(); int n;
scanf("%d",&n);
for (int i=;i<=n;i++)
scanf("%d",&a[i].x),a[i].y=work(a[i].x,); sort(a+,a+n+,cmp);
int ans=a[].y;
n=min(n,); for (int i=;i<=n;i++)
for (int j=i+;j<=n;j++){
if (ans>a[i].y*a[j].y) break;
else ans=max(ans,work(a[i].x,a[j].x));
} printf("%d\n",ans);
return ;
}
但是你 会发现还是很慢,超级慢,9000ms 了,然后又看一份代码,发现!!
我们枚举的
for (int i=1;i<=n;i++)
for (int j=i+1;j<=n;j++)
因为 n可能很大,大概10万,但是后面大多没用,所以我们只要 n<=1000,之类的就够了。 暴力简直可怕
hihocoder 1165 : 益智游戏的更多相关文章
- hihoCoder #1165 : 益智游戏 (挑战赛11 B题)
题意:在一个序列中找到两个数a和b,使得a*b的因子个数最多,输出最多的因子个数. 思路:数据较多,处理会很慢.对序列中每个数字进行质数分解求因子个数,然后按照因子个数降序排列,对前50个因子最多的数 ...
- hihocoder -1121-二分图的判定
hihocoder -1121-二分图的判定 1121 : 二分图一•二分图判定 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 大家好,我是小Hi和小Ho的小伙伴Net ...
- Hihocoder 太阁最新面经算法竞赛18
Hihocoder 太阁最新面经算法竞赛18 source: https://hihocoder.com/contest/hihointerview27/problems 题目1 : Big Plus ...
- hihoCoder太阁最新面经算法竞赛15
hihoCoder太阁最新面经算法竞赛15 Link: http://hihocoder.com/contest/hihointerview24 题目1 : Boarding Passes 时间限制: ...
- 【hihoCoder 1454】【hiho挑战赛25】【坑】Rikka with Tree II
http://hihocoder.com/problemset/problem/1454 调了好长时间,谜之WA... 等我以后学好dp再来看为什么吧,先弃坑(╯‵□′)╯︵┻━┻ #include& ...
- 【hihocoder#1413】Rikka with String 后缀自动机 + 差分
搞了一上午+接近一下午这个题,然后被屠了个稀烂,默默仰慕一晚上学会SAM的以及半天4道SAM的hxy大爷. 题目链接:http://hihocoder.com/problemset/problem/1 ...
- 【hihoCoder】1148:2月29日
问题:http://hihocoder.com/problemset/problem/1148 给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期). 思路: 1. 将问题转换成求两个日 ...
- 【hihoCoder】1288 : Font Size
题目:http://hihocoder.com/problemset/problem/1288 手机屏幕大小为 W(宽) * H(长),一篇文章有N段,每段有ai个字,要求使得该文章占用的页数不超过P ...
- 【hihoCoder】1082: 然而沼跃鱼早就看穿了一切
题目:http://hihocoder.com/problemset/problem/1082 输入一个字符串,将其中特定的单词替换成另一个单词 代码注意点: 1. getline(istre ...
随机推荐
- Hadoop 常用命令之 HDFS命令
命令 说明 hadoop fs -mkdir 创建HDFS目录 hadoop fs -ls 列出HDFS目录 hadoop fs -copyFromLocal 使用-copyFromLocal 复制本 ...
- [Python學習筆記] 使用xlwings 插入註解 (forked 版本)
到今天為止 xlwings 還沒有插入註解的功能 去原始開發者的 Github Pull Requests 他說之前有人有建議要加入這個功能 但他還沒更新~ 如果需要使用 Python 來插入註解的話 ...
- Animate.css_css3动画库介绍
插件描述:Animate.css内置了很多典型的css3动画,兼容性好使用方便. Animate.css是一个有趣的,跨浏览器的css3动画库.很值得我们在项目中引用. 用法 1.首先引入animat ...
- 7-Java-C(四平方和)
题目描述: 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和. 如果把0包括进去,就正好可以表示为4个数的平方和. 比如: 5 = 0^2 + 0^2 + 1^2 + ...
- uva1608 Non-boring sequences
某个序列找到唯一元素后,判断被分成的两边的序列即可问题在于找到唯一元素连续序列,重复元素的问题:感觉很有一般性 查找相同元素用map,last,next存上一个相同元素的位置复杂度计算有点思考:记录l ...
- Bug的定义和分类
什么是BUG 使用人工或自动手段,来运行或测试某个系统的过程.其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别 BUG分类 完全没有实现的功能 基本实现了用户需要的功能,但是运行时 ...
- Opencv竟然有中文资料
最近对于OpenCV看的较多,竟然不知不觉找到了一个中文网站,对于母语真的桥开心的嘻嘻 直方图均衡化: http://www.opencv.org.cn/opencvdoc/2.3.2/html/do ...
- Css选择器和JQuery基本编程接口
使用JQuery之前,首先从官网下载库文件 http://jquery.com/ jquery-2.1.4.js和jquery-2.1.4.min.js,前者是完整无压缩版本,用于开发调试:后者是压缩 ...
- [LUOGU] P2704 炮兵阵地
题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队. 一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示), 也可能是平原(用"P&q ...
- Postman插件如何安装
我们chrome插件网热门推荐的软件之一就是postman.但是postman的适应平台分为:postman chrome应用程序,postman应用程序,postman插件.谷歌应用商店从2018年 ...