码迷,mamicode.com
首页 > 其他好文 > 详细

Atcoder Tenka1 Programmer Contest 2019

时间:2019-04-20 23:02:05      阅读:311      评论:0      收藏:0      [点我收藏+]

标签:printf   情况   不能   长度   namespace   contest   ace   大于   表示   

C

签到题,f[i][0/1]表示以i结尾最后一个为白/黑的最小值,转移显然。

技术图片
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+7;
int n,f[N][2];
char s[N];
int main()
{
    scanf("%d",&n);
    scanf("%s",s+1);
    for(int i=1;i<=n;i++)
    if(s[i]==.)
    {
        f[i][0]=f[i-1][0];
        f[i][1]=min(f[i-1][0],f[i-1][1])+1;
    }
    else{
        f[i][0]=f[i-1][0]+1;
        f[i][1]=min(f[i-1][0],f[i-1][1]);
    }
    printf("%d\n",min(f[n][0],f[n][1]));
}
View Code

D

方案数=总方案数-不能拼成三角形的方案数。不能拼成三角形,即最长边大于等于边总和的一半。于是可以f[i]表示以i为最长边能组成三角形的方案数,g[i]表示凑成长度为i的边方案。f[0]=2^n,g[0]=1,然后每次转移f除以2即可。注意讨论最长边为总和一半的情况(没讨论WA了一发)。

技术图片
#include<bits/stdc++.h>
using namespace std;
const int N=307,mod=998244353,inv2=499122177,inv3=332748118;
int n,ans,sum,lim,pw2[N],pw3[N],a[N],f[N*N],g[N*N];
int main()
{
    scanf("%d",&n);
    ans=f[0]=g[0]=1;
    for(int i=1;i<=n;i++)f[0]=2ll*f[0]%mod;
    for(int i=1;i<=n;i++)
    {
        ans=3ll*ans%mod;
        scanf("%d",&a[i]);
        sum+=a[i];
        for(int j=sum;j>=a[i];j--)
        f[j]=(f[j]+1ll*f[j-a[i]]*inv2)%mod,g[j]=(g[j]+g[j-a[i]])%mod;
    }
    lim=(sum+1)/2;
    for(int i=lim;i<=sum;i++)ans=(ans-3ll*f[i]%mod+mod)%mod;
    if(sum%2==0)ans=(ans+3ll*g[lim])%mod;
    printf("%d\n",ans);
}
View Code

E

F

rank=105,rating+=108,因为原本rating过低。

Atcoder Tenka1 Programmer Contest 2019

标签:printf   情况   不能   长度   namespace   contest   ace   大于   表示   

原文地址:https://www.cnblogs.com/hfctf0210/p/10743123.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!