【发布时间】:2021-01-10 11:21:55
【问题描述】:
在一个数列中排除一个数,使所有其他数的最大除数最多。找出被排除项的索引和最大的最大公约数。
这是我的代码:
#include <iostream>
using namespace std;
int gcd(int x, int y) {
while (y) {
int r=x%y;
x=y;
y=r;
}
return x;
}
int pcd(int arr[], int u, int w) {
int temp=arr[u];
arr[u]=0;
int result=0;
for (int i=1; i<=w; i++) {
result=gcd(result, arr[i]);
}
arr[u]=temp;
return result;
}
int main() {
int n;
cin>>n;
int a[100000];
for (int i=1; i<=n; i++) {
cin>>a[i];
}
int t=0;
int v;
for (int j=1; j<=n; j++) {
if (pcd(a, j, n)>t) {
t=pcd(a, j, n);
v=j;
}
}
cout<<v<<" "<<pcd(a, v, n);
}
如何加快我的代码速度?它正在运行超过时间限制。
【问题讨论】:
-
这个“作业”似乎来自某种竞赛网站。这些网站上的问题都是关于使用诡计来帮助解决问题的。要么通过找到一个不需要循环来计算结果的公式,要么通过缓存先前计算的结果(在比赛现场称为动态编程)。
-
虽然您还没有陷入此类网站所教授的所有不良代码陷阱,但您仍然需要克服一些不良习惯(即使在此类网站上也是如此)。就像没有语义意义的单字母变量,缺少 cmets,大数组而不是例如
std::vector,基于 1 的索引。仅举几例。 -
实际上,“排除”是牙科中使用的一个词......当颌骨闭合时导致(相对的牙齿)无法相遇。
-
我明白这一点。我用过“排除”
标签: c++ time-complexity dynamic-programming