Codeforces Round #666 (Div. 2)
题目
D. Stoned Game

分析
如果最大的一堆大于其余所有之和,那么先手必胜,否则根据奇偶来判断
代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+n+1);
int sum=0;
for(int i=1;i<=n-1;i++)
{
sum+=a[i];
}
if(sum<a[n]) cout<<"T"<<endl;
else if((sum+a[n])%2) cout<<"T"<<endl;
else cout<<"HL"<<endl;
}
}
CF1396C Monster Invaders

分析

代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+10;
int dp[N][2];
int a[N];
signed main()
{
int n,r1,r2,r3,d;
cin>>n>>r1>>r2>>r3>>d;
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
memset(dp,0x3f,sizeof dp);
dp[1][0]=r1*a[1]+r3;
dp[1][1]=min(r1*(a[1]+1),r2);
for(int i=2;i<=n;i++)
{
dp[i][0]=min({dp[i][0],dp[i-1][0]+r1*a[i]+r3+d,dp[i-1][1]+3*d+2*r1+min(r1*(a[i]+1),r2)});
dp[i][1]=min({dp[i][1],dp[i-1][0]+d+min(r1*(a[i]+1),r2),r1+dp[i-1][1]+3*d+min(r1*(a[i]+1),r2)});
}
int ans=min(dp[n][0],dp[n-1][1]+d+a[n]*r1+r3+d+r1);
printf("%lld",ans);
}

浙公网安备 33010602011771号