• Codeforces Round #666 (Div. 1)翻车祭


    这段时间有点忙,好久没打CF了

    A

    考虑到n与n-1互质,可以把数列分成两段操作[1,1][2,n],全部加成n的倍数,再操作[1,n]即可,注意特判n=1

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=1e5+7;
    int n;
    ll a[N];
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
        if(n==1)
        {
            puts("1 1
    1");
            puts("1 1
    1");
            a[1]+=2;
            printf("1 1
    %lld",-a[1]);
            return 0;
        }
        puts("1 1");
        ll x=n-a[1]%n;
        printf("%lld
    ",x);
        a[1]+=x;
        printf("2 %d
    ",n);
        for(int i=2;i<=n;i++)
        {
            x=(a[i]%n)*(n-1);
            a[i]+=x;printf("%lld ",x);
        }
        puts("");
        printf("%d %d
    ",1,n);
        for(int i=1;i<=n;i++)printf("%lld ",-a[i]);
    }
    View Code

    B

    少考虑一种极端数据,导致我一直WA on test 4,一直杠B没去看C,从而导致我翻车。

    打表观察发现正常情况下和为奇数先手胜,反之后手胜,但有一种极端情况:当最大的一堆*2>总石子数时,先手可以一直取那一堆从而获胜。

    #include<bits/stdc++.h>
    using namespace std;
    const int N=2e5+7;
    int n,a[N],b[N];
    int main()
    {
        int T;cin>>T;
        while(T--)
        {
            cin>>n;
            int mx=0,sum=0;
            for(int i=1;i<=n;i++)cin>>a[i],sum+=a[i],mx=max(mx,a[i]);
            if(mx*2>sum||(sum&1))puts("T");
            else puts("HL");
        }
    }
    View Code

    C

    看B没看C,发现C比B简单得多,每次BOSS若没打完,必定会在下一关回头,直接DP即可,式子很复杂。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=1e6+7;
    ll n,m,k,t,r1,r2,r3,d,a[N],f[N][2];
    int main()
    {
        cin>>n>>r1>>r2>>r3>>d;
        for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
        memset(f,0x3f,sizeof f);
        f[1][0]=a[1]*r1+r3,f[1][1]=min(a[1]*r1+r1,r2);
        for(int i=1;i<n;i++)
        {
            f[i+1][1]=min(f[i][0]+min(a[i+1]*r1+r1,r2),f[i][1]+2*d+r1+min(a[i+1]*r1+r1,r2))+d;
            f[i+1][0]=min(min(f[i][1]+2*d+r1+a[i+1]*r1+r3,f[i][0]+a[i+1]*r1+r3),f[i][1]+2*r1+2*d+min(a[i+1]*r1+r1,r2))+d;
        }
        printf("%lld",min(f[n][0],f[n-1][1]+2*d+r1+a[n]*r1+r3));
    }
    View Code

    然后我就凉了

    rank=1143 rating-=88

  • 相关阅读:
    《Java并发编程实战》(五)---- 任务执行
    《Java并发编程实践》(四)---- 构建阻塞
    《Java并发编程实践》(三)---- 组合对象
    《Java8实战》(三)---- 重构测试和调试
    《Java核心技术》---- 多线程
    《Java并发编程实战》(二)---- 对象的共享
    《Java 8 实战》(三)---- 流
    《Java 8 实战》(二)—— Lambda
    《Java 8 实战》(一)——通过行为参数化传递代码
    Android_问卷调查
  • 原文地址:https://www.cnblogs.com/hfctf0210/p/13587805.html
Copyright © 2020-2023  润新知