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\n1");
        puts("1 1\n1");
        a[1]+=2;
        printf("1 1\n%lld",-a[1]);
        return 0;
    }
    puts("1 1");
    ll x=n-a[1]%n;
    printf("%lld\n",x);
    a[1]+=x;
    printf("2 %d\n",n);
    for(int i=2;i<=n;i++)
    {
        x=(a[i]%n)*(n-1);
        a[i]+=x;printf("%lld ",x);
    }
    puts("");
    printf("%d %d\n",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

posted @ 2020-08-31 09:04  hfctf0210  阅读(257)  评论(0编辑  收藏  举报