【发布时间】:2020-02-04 21:37:00
【问题描述】:
问题描述:
给你一个序列
A1,A2,…,AN。对于每个有效的i,元素A_i的星号是有效索引j<i的数量,这样A_j可以被A_i整除。找出给定序列中的最大星值。
我的尝试:
我已经尝试过一种方法,可以在数组中找到最大元素,直到i'th 索引(比如MAX_i)。我为所有元素保留一个计数数组f[]。
我正在从A_i 迭代到MAX_i 和A_i 的倍数,并计算可被A_i 整除的元素数
ans=ans+f[element]
long long int n,key,m=-1,ans=0,star_max=-1;
int f[1000004];
memset(f, 0, sizeof(f));
scanf("%lld", &n);
for (int i = 0; i < n; ++i)
{
scanf("%lld", &key);
ans=0;
for(long long int i=key;i<m;i+=key)
{
ans+=f[i];
}
if(ans > star_max)
star_max=ans;
f[key]++;
if (a[i] > m)
m=a[i];
}
cout<<star_max;
任何 O(N) 或 O(NlogN) 方法都值得赞赏。
【问题讨论】:
-
是C++程序还是C程序?
-
假设列表是 [a,b,c,d,e,f,g]。现在如果 'd' 可以被 'g' 整除,那么 'd' 后面的所有数字都是'd' 的倍数也可以被 'g' 整除。所以很明显'g'将比'd'有更多的倍数。所以,忽略 'd' 并且不需要检查它。
-
@Anubhaw Choudhary 愿可除数之间存在差距,例如 A0 可以被 A3 整除,A1 不能被 A3 整除,A2 可以被 A3 整除。所以可整除数的最大长度等于2。对吗?
-
@Vlad 来自莫斯科,是的,可能存在差距