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 ...
随机推荐
- Entity Framework + MySQL 使用笔记
添加: using (var edm = new NorthwindEntities()) { Customers c = ", Region = "天府广场", Con ...
- qt sql多重条件查询简便方法
转载请注明出处:http://www.cnblogs.com/dachen408/p/7457312.html 程序设计过程中,经常要涉及到查询,并且有很多条件,且条件可为空,如果逐个判断,会有很多情 ...
- 解决selenium.common.exception.WebDriverException:Message:'chromedriver' executable needs to be in Path
'chromedriver' executable needs to be in Path 声明:本人萌新,刚学python不久记录一下自己的坑,发出来若能帮助到一些人尽早解决问题那便是极好的,( ̄▽ ...
- 朴素贝叶斯法(naive Bayes)
<统计学习方法>(第二版)第4章 4 朴素贝叶斯法 生成模型 4.1 学习与分类 基于特征条件独立假设学习输入输出的联合概率分布 基于联合概率分布,利用贝叶斯定理求出后验概率最大的输出 条 ...
- uva1439 Exclusive Access 2
感觉这道题读题有点难..似乎和现实联系的比较密切1.每个process的两个资源可以顺序反一下2.p->q,q->s不可以同时进行 p->q,p->s可以 输出最长等待链输出每 ...
- zabbix 报警通知选项配置
{TRIGGER.STATUS} host: {HOSTNAME} IP: {HOST.IP} events_time:{EVENT.DATE} {EVENT.TIME} notice_time:{D ...
- ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath
问题: ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the ...
- nginx可用来干什么?
1.静态HTTP服务器 首先,Nginx是一个HTTP服务器,可以将服务器上的静态文件(如HTML.图片)通过HTTP协议展现给客户端. 配置: server { listen80; # 端口号 lo ...
- Java中的反射--Reflect
在张孝祥老师的Java讲解中,学习到了Java反射的一部分知识,觉得有必要好好学习一下哈. 一.反射的理解 经典总结:反射就是把Java类中的各种成分映射成为相应的Java类 例如:一个Java类中用 ...
- 从零开始--系统深入学习Android
http://www.cnblogs.com/tianjian/category/354587.html