这段时间有点忙,好久没打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]); }
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"); } }
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)); }
然后我就凉了
rank=1143 rating-=88