zoukankan      html  css  js  c++  java
  • AtCoder Grand Contest 030 自闭记

      A:阅读。

    #include<iostream> 
    #include<cstdio>
    #include<cmath>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    #define ll long long
    char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
    int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
    int read()
    {
        int x=0,f=1;char c=getchar();
        while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
        while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
        return x*f;
    }
    int a,b,c;
    int main()
    {
        a=read(),b=read(),c=read();
        cout<<b+min(c,a+b+1);
        return 0;
    }
    View Code

      B:一个显然的做法是设f[i][j][0/1]为已经砍掉了1~i和j~n的树且停在左/右边的最长路,类似区间dp转移即可。因为开始头铁想了会正解和初始化出了些锅,很久之后才过掉这个部分分。

    #include<iostream> 
    #include<cstdio>
    #include<cmath>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    #define ll long long
    #define N 200010
    char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
    int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
    int read()
    {
        int x=0,f=1;char c=getchar();
        while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
        while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
        return x*f;
    }
    int n,m,a[N];
    ll ans,f[2010][2010][2];
    int main()
    {
        m=read(),n=read();
        for (int i=1;i<=n;i++) a[i]=read();a[n+1]=m;
        memset(f,200,sizeof(f));
        f[1][n+1][0]=a[1],f[0][n][1]=m-a[n];
        for (int i=2;i<=n;i++)
            for (int j=0;j<=i;j++)
            {
                if (j) f[j][n+1-(i-j)][0]=max(f[j-1][n+1-(i-j)][0]+a[j]-a[j-1],f[j-1][n+1-(i-j)][1]+a[j]+m-a[n+1-(i-j)]);
                if (j<i) f[j][n+1-(i-j)][1]=max(f[j][n+2-(i-j)][1]+a[n+2-(i-j)]-a[n+1-(i-j)],f[j][n+2-(i-j)][0]+a[j]+m-a[n+1-(i-j)]);
            }
        for (int i=1;i<=n;i++) ans=max(ans,f[i][i+1][0]),ans=max(ans,f[i][i+1][1]);
        cout<<ans;
        return 0;
    }
    View Code

      脑补一下正解,考虑效果相同的两种走法:顺逆顺、逆顺顺,容易发现第一种总是比第二种优,这说明一旦某次改变方向,之后每次都要改变方向才能保证最优。于是枚举一下最开始怎么走,对每种方案求一下取max即可。

      然后因为一些原因也没什么心思想题,就这么心态平稳地自闭到结束了。根本没脸写这玩意了题过会再补

      result:rank 312 rating +56 怎么打成什么样都涨分啊?

      upd:咕咕咕

  • 相关阅读:
    2.pt-table-checksum工具
    Mysql8.0新特性01
    12.redis 之阅读大佬文章随笔
    4.Mysql之Mysqldump命令
    5. 关于高负载服务器Kernel的TCP参数优化
    Mysql Oracle 备份表数据、批量删除表数据
    Mysql limit用法
    Java 字符串数组转字符串
    Layui 自定义年份下拉框并且可输入
    Mysql 生成UUID
  • 原文地址:https://www.cnblogs.com/Gloid/p/10198239.html
Copyright © 2011-2022 走看看