A,B两题太水了,就不写了。
题意:给定n个数,每次可以替换一个数,求n个数的最大公因数。
思路:求一遍前缀后缀gcd再枚举
#include<bits/stdc++.h>
using namespace std;
int a[100005];
int pre[100005],bk[100005];
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int mx=0,t1,t2;
pre[0]=a[0];
for(int i=1;i<n;i++)
pre[i]=__gcd(pre[i-1],a[i]);
bk[n-1]=a[n-1];
for(int i=n-2;i>=0;i--)
bk[i]=__gcd(bk[i+1],a[i]);
int ans=0;
for(int i=0;i<n;i++)
ans=max(ans,__gcd(pre[i-1],bk[i+1]));
printf("%d\n",ans);
}
题意:给定n个数,每次可以使得ai和ai+1变成相反数,求能使得n个数的和最大,并求出最大值。
思路:记录负数的个数,如果是偶数,则可以全部化为正数,如果为奇数,这选择绝对值最小的一个,最后sum-=2*minn;
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,x;
long long sum=0;
scanf("%d",&n);
int f=0,mn=1e9+1;
for(int i=0;i<n;i++){
scanf("%d",&x);
if(x<0)
f++;
sum+=abs(x);
mn=min(mn,abs(x));
}
if(f%2==1)
sum-=2*mn;
printf("%lld\n",sum);
}