题意: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); } }