HDU 6025

从n个数中选n-1个数字使得他们的gcd最大

思路:求一个前缀和一个后缀

#include<bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;
int a[N],t[N],s[N];
int T,n,ans;

int gcd(int x,int y)
{
    if(y == 0) return x;
    return gcd(y,x % y);
}

int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        ans = 0;
        for(int i = 1;i <= n; ++i)
        {
            scanf("%d",&a[i]);
            if(i == 1) s[i] = a[i];
            else s[i] = gcd(s[i - 1],a[i]);
        }
        t[n] = a[n];
        for(int i = n - 1;i >= 1; --i)
            t[i] = gcd(t[i + 1],a[i]);
        for(int i = 1;i <= n; ++i)
        {
            if(i == 1) ans = max(ans,t[2]);
            else if(i == n) ans = max(ans,s[n - 1]);
            else ans = max(ans,gcd(s[i - 1],t[i + 1]));
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

 

 

类似的:从n个数中选n-1个数字使得他们的异或值最大

https://ac.nowcoder.com/acm/contest/549/D

#include<bits/stdc++.h>
using namespace std;

const int N = 5e6 + 10;
int a[N],t[N],s[N];
int T,n,ans;

int main()
{
    while(~scanf("%d",&n))
    {
        ans = 0;
        for(int i = 1;i <= n; ++i)
        {
            scanf("%d",&a[i]);
            if(i == 1) s[i] = a[i];
            else s[i] = s[i - 1] | a[i];
        }
        t[n] = a[n];
        for(int i = n - 1;i >= 1; --i)
            t[i] = t[i + 1] | a[i];
        for(int i = 1;i <= n; ++i)
        {
            if(i == 1) ans = max(ans,t[2]);
            else if(i == n) ans = max(ans,s[n - 1]);
            else ans = max(ans,s[i - 1] | t[i + 1]);
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

全部评论

相关推荐

07-03 16:02
门头沟学院 Java
点赞 评论 收藏
分享
门口唉提是地铁杀:之前b站被一个游戏demo深深的吸引了。看up主页发现是个初创公司,而且还在招人,也是一天60。二面的时候要我做一个登录验证和传输文件两个微服务,做完要我推到github仓库,还要我加上jaeger和一堆运维工具做性能测试并且面试的时候投屏演示。我傻乎乎的做完以后人家跟我说一句现在暂时不招人,1分钱没拿到全是白干
你的秋招第一场笔试是哪家
点赞 评论 收藏
分享
05-22 12:44
已编辑
门头沟学院 golang
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务