女赛--Coprime Sequence

题意:n个数,GCD为1,求除去其中一个数,要求剩余GCD最大,输出最大的GCD
思路:开两个数组,记录一下从前往后,和从后往前的GCD,再每个点遍历一遍,求前后,不带当前点的GCD。代码一看就明白了。。
感想:当时比赛的时候就被难住了。。最后忘记A没A了,,但是后来看过题解,当时发现是个思维题,想明白了实现是真的简单。但是这次又做又忘了。。。只记得当时思维挺可以的,这个思维真的不难,没想到真的是自己的问题,然后因为当时是个组队赛,是交给队友做的,自己的思路没有敲。。这次就先用的自己当初的思路做的。。果然WA了。。。想了好久,找出一种错误样例。。陈旧的错误思想就不分享了。。赶紧忘掉,希望以后这种题自己长个记性。。。

代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;
#define INF 0x3f3f3f3f;
int a[100005],t,n,x,y,ans,sum[100005],sum1[100005];
int GCD(int aa,int bb)
{
    if(aa%bb==0) return bb;
    return GCD(bb,aa%bb);
}
int main()
{
    cin>>t;
    while(t--)
    {
        scanf("%d",&n);
        ans=1;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        sum[1]=a[1];
        for(int i=2;i<=n;i++)
        {
           sum[i]=GCD(sum[i-1],a[i]);
        }
        sum1[n]=a[n];
        for(int i=n-1;i>=1;i--)
            sum1[i]=GCD(sum1[i+1],a[i]);
            //cout<<"!!"<<endl;
            ans=max(sum[n-1],sum1[2]);
        for(int i=2;i<=n-1;i++)
        {
            ans=max(GCD(sum[i-1],sum1[i+1]),ans);
        }
        printf("%d\n",ans);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_37868325/article/details/80275586