欢乐赛#33题解 T4
2024-11-13 15:24:06
发布于:江苏
4阅读
0回复
0点赞
- 计算因子个数:
- 定义函数
countFactors
,用于计算一个整数的因子个数。通过从1
到该整数的平方根进行遍历,因为如果i
是num
的因子,那么num / i
也是num
的因子(除了i
和num / i
相等的情况,此时只算一个)。 - 对于每个能整除
num
的i
,先将因子个数加2
(表示i
和num / i
两个因子),如果i
和num / i
相等,就需要把多算的一次减掉,从而准确得到num
的因子个数。
- 定义函数
- 处理输入并计算因子个数序列:
- 在
main
函数中,先读取输入的n
(整数个数)和m
(目标累加和)。 - 然后通过循环依次读取
n
个整数,对于每个读取到的整数tmp
,调用countFactors
函数计算其因子个数,并将结果添加到向量v
中,这样就得到了所有整数的因子个数构成的向量。
- 在
- 排序与累加查找:
- 使用
sort
函数对向量v
中的因子个数进行排序,排序方式是从大到小(通过greater<int>
指定)。 - 接着通过循环依次累加排序后的因子个数,用变量
sum
记录累加和。在每次累加后,判断sum
是否大于等于m
,如果满足这个条件,就输出当前的累加次数i + 1
(因为索引是从0
开始的,所以要加1
才是从1
开始计数的正确索引),然后程序结束。
- 使用
复杂度分析
- 时间复杂度:
- 计算因子个数部分:对于每个整数计算因子个数时,需要从
1
到该整数的平方根进行遍历,假设输入的整数最大值为N
,那么计算一个整数因子个数的时间复杂度大约为 。总共要计算n
个整数的因子个数,所以这部分的时间复杂度大约为 。 - 排序部分:使用
sort
函数对向量v
进行排序,一般sort
函数的时间复杂度为 ,这里n
是向量v
的长度,也就是输入的整数个数。 - 累加查找部分:通过循环依次累加向量
v
中的元素,时间复杂度为 。 - 综合起来,整个程序的时间复杂度大约为 ,简化后约为 。
- 计算因子个数部分:对于每个整数计算因子个数时,需要从
- 空间复杂度:
- 主要的空间消耗在于存储每个整数的因子个数的向量
v
,向量v
的长度最大为n
,所以空间复杂度为 。
- 主要的空间消耗在于存储每个整数的因子个数的向量
#include <bits/stdc++.h>
#define endl "\n"
#define debug freopen("in.txt", "r", stdin), freopen("out.txt", "w", stdout)
using namespace std;
vector<int> v;
int n, m, tmp;
// 计算因子个数
int countFactors(int num)
{
int count = 0;
for (int i = 1; i <= sqrt(num); ++i)
{
if (num % i == 0)
{
count += 2; // i 和 num/i 都是因子
if (i == num / i)
count--; // 如果 i 和 num/i 相等,则只算一个
}
}
return count;
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
scanf("%d", &tmp);
v.push_back(countFactors(tmp));
}
sort(v.begin(), v.end(), greater<int>()); // 对因子个数进行排序
int sum = 0;
for (int i = 0; i < v.size(); i++)
{
sum += v[i];
if (sum >= m)
{
cout << i + 1 << endl;
return 0;
}
}
return 0;
}
这里空空如也
有帮助,赞一个