AtCoder Beginner Contest 125

A - Biscuit Generator
分析:签到题

#include "bits/stdc++.h"
using namespace std;
long long A,B,T;
long long dp[100];
int main()
{
    cin>>A>>B>>T;
    dp[1]=A;
    for(int i=2;i<=20;i++) dp[i]=dp[i-1]+A;
    long long sum=0;
    for(int i=1;i<=20;i++){
        if(dp[i]>T+0.5){
            break;
        }
        sum+=B;
    }
    cout<<sum<<endl;
    return 0;
}

B - Resale
分析:把所有v-c为正的加进去即可

#include "bits/stdc++.h"
using namespace std;
typedef long long LL;
const int maxn=50+10;
struct node{
    LL v,c;
    LL cha;
}p[maxn];
int n;
bool cmp(node x,node y){
    return x.cha>y.cha;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>p[i].v;
    for(int i=1;i<=n;i++) cin>>p[i].c;
    for(int i=1;i<=n;i++) p[i].cha=p[i].v-p[i].c;
    sort(p+1,p+1+n,cmp);
    int sum=0;
    for(int i=1;i<=n;i++){
        if(p[i].cha>=0) sum+=p[i].cha;
    }
    cout<<sum<<endl;
    return 0;
}

C - GCD on Blackboard
分析:维护一个前缀的gcd和一个后缀的gcd,枚举每个位置,求其前缀和后缀gcd的最大值

#include "bits/stdc++.h"
using namespace std;
const int maxn=1e5+100;
typedef long long LL;
LL dp1[maxn],dp2[maxn];
int n;
LL a[maxn];
LL gcd(LL a,LL b){
    return b>0?gcd(b,a%b):a;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    a[0]=a[1],a[n+1]=a[n];
    for(int i=1;i<=n;i++){
        dp1[i]=gcd(a[i],dp1[i-1]);
    }
    for(int i=n;i>=1;i--){
        dp2[i]=gcd(dp2[i+1],a[i]);
    }
    LL ans=0;
    for(int i=1;i<=n;i++){
        if(i==1){
            ans=max(ans,dp2[i+1]);
        }else if(i==n){
            ans=max(ans,dp1[i-1]);
        }else{
            LL tmp=gcd(dp1[i-1],dp2[i+1]);
            ans=max(ans,tmp);
        }
    }
    printf("%lld\n",ans);
    return 0;
}

D - Flipping Signs
分析:看负数的个数,如果个数是偶数,则可以全部变成正数,如果个数是奇数,则有一个无法变成整数,那一定选绝对值最小的那个

#include "bits/stdc++.h"
using namespace std;
const int maxn=1e5+100;
typedef long long LL;
LL dp1[maxn],dp2[maxn];
int n;
LL a[maxn];
LL gcd(LL a,LL b){
    return b>0?gcd(b,a%b):a;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    a[0]=a[1],a[n+1]=a[n];
    for(int i=1;i<=n;i++){
        dp1[i]=gcd(a[i],dp1[i-1]);
    }
    for(int i=n;i>=1;i--){
        dp2[i]=gcd(dp2[i+1],a[i]);
    }
    LL ans=0;
    for(int i=1;i<=n;i++){
        if(i==1){
            ans=max(ans,dp2[i+1]);
        }else if(i==n){
            ans=max(ans,dp1[i-1]);
        }else{
            LL tmp=gcd(dp1[i-1],dp2[i+1]);
            ans=max(ans,tmp);
        }
    }
    printf("%lld\n",ans);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/gzgywh/p/10925069.html