hihoCoder #1165 : 益智游戏 (挑战赛11 B题)

题意:在一个序列中找到两个数a和b,使得a*b的因子个数最多,输出最多的因子个数。

思路:数据较多,处理会很慢。对序列中每个数字进行质数分解求因子个数,然后按照因子个数降序排列,对前50个因子最多的数进行暴力求两两之积的因子个数就行了。1s左右就能出结果。低于50的就会WA了。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int a[100005];
 4 pair<int,int> pa[100005];
 5 int getAllFactors(int x, vector<int> &vect) //辅助!
 6 {
 7     for (int j = 2 ; j * j <= x ; ++ j)
 8     {
 9         while (x % j == 0)
10             vect.push_back(j) , x /= j;
11     }
12     if(x>1)
13         vect.push_back(x);
14     return vect.size();
15 }
16
17 int getFactors(vector<int> &num)
18 {
19     vector< vector<int> >   all;
20     all.resize(num.size());
21     for(int i=0; i<num.size(); i++)
22         getAllFactors( num[i], all[i]);
23
24     vector<int> tmp;
25     for(int i=0; i<all.size(); i++)
26         tmp.insert(tmp.end(), all[i].begin(), all[i].end());
27     sort(tmp.begin(), tmp.end());
28
29     int z=1;
30     for (int i = 0 ; i < tmp.size() ; i++)
31     {
32         int l = i;
33         while (l < tmp.size() && tmp[l] ==tmp[i])
34             ++ l;
35         z *= l - i + 1;
36         i = l - 1;
37     }
38     return z;
39 }
40
41 int factors(int N)
42 {
43     if(1 == N) return 1;
44     int cnt = 2;
45     for (int j = 2 ; j * j <= N ; j++)
46     {
47         if (N % j == 0)
48         {
49             cnt++;
50             if (j * j != N)
51                 cnt++;
52         }
53     }
54     return cnt;
55 }
56
57 int main() {
58     //freopen("input.txt", "r", stdin);
59     int t;
60     while(cin>>t)
61     {
62         for(int i=0; i<t; i++)
63         {
64             scanf("%d",&a[i]);
65             pa[i]=make_pair(factors(a[i]),a[i]);
66         }
67
68         sort(pa,pa+t);
69         reverse(pa,pa+t);
70         vector<int> tmp;
71         int n = t>500? 500: t;
72         int ans=0;
73         for(int i=0; i<n; i++)
74         {
75             for(int j=i; j<n; j++)
76             {
77                 tmp.clear();
78                 tmp.push_back(pa[i].second);
79                 tmp.push_back(pa[j].second);
80                 ans=max(getFactors(tmp), ans);
81             }
82         }
83         cout<<ans<<endl;
84     }
85     return 0;
86 }

AC代码

时间: 2024-12-11 05:01:34

hihoCoder #1165 : 益智游戏 (挑战赛11 B题)的相关文章

hihocoder 1165 : 益智游戏

时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 幽香今天心情不错,正在和花田里的虫子玩一个益智游戏.这个游戏是这样的,对于一个数组A,幽香从A中选择一个数a,虫子从A中选择一个数b.a和b可以相同.她们的分数是a*b的因子的个数.幽香和虫子当然想要获得尽可能的高的分数,你能告诉她们应该选择哪两个数吗.由于幽香是个非常随意的人,数组A中的元素都是她随机选择的. 输入 一行一个数n,表示A中整数的数量.接下来一行n个数,分别表示a1,a2,...,an,为A中的元素.

Wannafly挑战赛11 D 白兔的字符串 Hash

Wannafly挑战赛11 D   白兔的字符串 白兔有一个字符串T.白云有若干个字符串S1,S2..Sn. 白兔想知道,对于白云的每一个字符串,它有多少个子串是和T循环同构的. 提示:对于一个字符串a,每次把a的第一个字符移动到最后一个,如果操作若干次后能够得到字符串b,则a和b循环同构. 所有字符都是小写英文字母 输入描述: 第一行一个字符串T(|T|<=10^6)第二行一个正整数n (n<=1000)接下来n行为S1~Sn (|S1|+|S2|+…+|Sn|<=10^7),max(

hihoCoder挑战赛11 益智游戏

题目链接:http://hihocoder.com/problemset/problem/1165 题面: 益智游戏 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 幽香今天心情不错,正在和花田里的虫子玩一个益智游戏. 这个游戏是这样的,对于一个数组A,幽香从A中选择一个数a,虫子从A中选择一个数b.a和b可以相同.她们的分数是a*b的因子的个数. 幽香和虫子当然想要获得尽可能的高的分数,你能告诉她们应该选择哪两个数吗. 由于幽香是个非常随意的人,数组A中的元素都是

hihoCoder挑战赛11.题目4 : 高等理论计算机科学(LCA)

clj在某场hihoCoder比赛中的一道题,表示clj的数学题实在6,这道图论貌似还算可以... 题目链接:http://hihocoder.com/problemset/problem/1167 由于是中文题目,题意不再赘述. 对于任意两条小精灵的活动路径a和b,二者相交的判断条件为b的两个端点的LCA在a的路径上:那么我们可以首先将每个活动路径端点的LCA离线预处理出来,对每个节点LCA值+1. 然后以某个节点(我选择的是节点1)为根进行深搜,算出一条从节点1到节点x的LCA值和,那么任意

hihoCoder挑战赛11 随机斐波那契

题目链接:http://hihocoder.com/problemset/problem/1164 题面: #1164 : 随机斐波那契 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 大家对斐波那契数列想必都很熟悉: a0 = 1, a1 = 1, ai = ai-1 + ai-2,(i > 1). 现在考虑如下生成的斐波那契数列: a0 = 1, ai = aj + ak, i > 0, j, k从[0, i-1]的整数中随机选出(j和k独立). 现在给定n,要

【hihoCoder】【挑战赛#12】

模拟+枚举+模拟……+构造 QAQAQQQ rank12求杯子! A 顺子 ……模拟题,分类讨论一下就好了……比如当前四张牌是不是同一花色……是不是连续的四张牌,如果是连续的四张牌,是不是两边的……(呀我好像忘了判左边...只判了J Q K A....没判A 2 3 4... 没关系加几个字符就好了……嗯代码已改 1 //hihocoder 12 A 2 #include<vector> 3 #include<cstdio> 4 #include<cstring> 5

剑指offer面试题笔记11~20题(Java实现)

一.面试题1:复制运算符函数(P24) 题目:如下为类型CMString的声明,请为该类型添加赋值运算符函数. class CMyString { public: CMyString(Char* pData = NULL); CMyString(const CMyString& str); ~CMyString(void); private: char* m_pData; } 解题思路: 二.面试题2:实现Singleton模式(P31) 题目:设计一个类,我们只能生成该类的一个实例. 解题思路

CCCC 以及 hihocoder offer收割赛11 ~~~

CCCC  真的很蒙  ,没有队服,没有狗牌,服务器崩溃到14:10  才开始比赛...(黑人问号 开始前,发现旁边是西交老大吴航,mad~各种紧张.看着大佬疯狂的敲宏定义就很怕啊.100多行,一行头文件,剩下的全是宏.... 然后忐忑的开始比赛,,,瞄了一眼周围的人都在写L2 L3.我默默地打开了L1...... 然后!!!!! 发现键盘按键是反的(打a出b,打b出a的那种),跟工作人员反应后,被告知设备老师不在 QAQ,然后又是手速场,特别怕自己敲不完题. 但是剩下最后一个半小时左右的时候已

第二届战神杯线上编程挑战赛月赛第一题:回文数

题目详情: Njzy学习了回文串后联想到了回文数,他希望统计出一个区间内的全部回文数.如今给定一个闭区间[a,b],求这个区间里有多少个回文数. 比方[20,30],仅仅有一个回文数那就是22. 输入描写叙述: 输入包括多组測试数据,每组測试数据包括两个整数a,b, (0<a<=b<10^6). 输出描写叙述: 对于每组測试数据输出对应的答案. 答题说明: 输入例子: 1 10 20 30 300 400 输出例子: 9 1 10 解题思路: total[i]代表从1到i之间有多少回文数