【问题标题】:Exclude a number in a sequence so that the greatest divisor common of all the other at most. Find the index of the excluded one and that maximum GCD排除一个数列,使所有其他数的最大除数最多。找到被排除的索引和最大 GCD
【发布时间】: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


【解决方案1】:

通过累加单向应用GCD的结果,维护一个前缀GCD列表和一个后缀GCD列表。然后遍历列表,检查GCD(prefix[i], suffix[i]) 的最大值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多