Codeforces Round #446 (Div. 2)

A. Greed

模拟

ac:

#include<bits/stdc++.h>
#define MAXN 100005
#define ll long long
using namespace std;

int a[MAXN]={0};

int main()
{
    int n,x;
    ll sum=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&x);
        sum+=x;
    }
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    sort(a,a+n);
    if(a[n-1]+a[n-2]>=sum)
        printf("YES\n");
    else printf("NO\n");
    return 0;
}

B. Wrath

简单模拟

ac:

#include<bits/stdc++.h>
#define MAXN 1000005
#define ll long long
using namespace std;

int a[MAXN]={0};
int vis[MAXN]={0};

int main()
{
    int n,sum=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    int maxi=0;//记录后面的刀到这个位置的最大剩余长度
    for(int i=n;i>=1;i--)
    {
        if(maxi>0)
            vis[i]=1;
        maxi--;
        if(a[i]>maxi)
            maxi=a[i];
    }
    for(int i=1;i<=n;i++)
        if(vis[i]==0)
            sum++;
    printf("%d\n",sum);
    return 0;
}

C. Pride

题意:

一个数组,数组中可以相邻两个的求gcd,然后赋给任意一个,

求最快把数组中所以都变成1的步数

如果变不出,输出-1

解析:

如果所有的数的最大公约数gcd(a1,a2,a3,a4,......)不是1,呢么不论怎么变换,都只能变换成总gcd,出现无解

如果a1~an中存在一个1,呢么ans=n-sum(1)

gcd(a1,a2,a3,a4,....)=先求a1和a2gcd,赋给a2,再求a2和a3的gcd,赋给a3,类推

gcd(a,b,c,d)=gcd(gcd(gcd(a,b),c),d)

我们需要找出最小长度的区间    l~r,    gcd(a[l],..,a[r])=1    暴力模拟

ac:

#include<bits/stdc++.h>
#define MAXN 2005
#define ll long long
using namespace std;//先变一个1出来

ll gcd(ll a,ll b)
{
    return b==0?a:gcd(b,a%b);
}

int a[MAXN]={0};

int main()
{
    int n,ans=999999,sum=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        if(a[i]!=1)
            sum++;
    }
    if(sum!=n)
    {
        printf("%d\n",sum);
    }
    else{
        for(int i=1;i<n;i++)
            for(int j=i+1;j<=n;j++)
            {
                a[i]=gcd(a[i],a[j]);
                if(a[i]==1)
                    ans=min(ans,j-i);
            }
        if(ans>=2000)
            printf("-1\n");
        else printf("%d\n",ans+n-1);
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值