zoukankan      html  css  js  c++  java
  • CF 1016 C —— 思路

    题目:http://codeforces.com/contest/1016/problem/C

    一定是先蛇形走在回形走,所以预处理、暴力即可;

    自己一开始写了一个,总是WA,又看了看TJ写法;

    模仿一下,还是WA,发现中间的一些地方 int 相乘要加 (ll)!

    然后把我原来那个改一下就A了...

    20分钟写,60分钟调...

    不过模仿的那个写法比我原来的快多了(虽然做法一样)。

    模仿:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    int const maxn=3e5+5;
    int n,g[3][maxn];
    ll s[3][maxn],f[3][maxn][3],ans;
    int main()
    {
        scanf("%d",&n);
        for(int i=0;i<n;i++)scanf("%d",&g[0][i]);
        for(int i=0;i<n;i++)scanf("%d",&g[1][i]);
        for(int j=0;j<=1;j++)
            for(int i=n-1;i>=0;i--)
            {
                f[j][i][0]=f[j][i+1][0]+(ll)(n-i-1)*g[j][i];//<-  
                f[j][i][1]=f[j][i+1][1]+(ll)i*g[j][i];//->  //走过来一定在 i 时间或以后 
                s[j][i]=s[j][i+1]+g[j][i];
            }
        ll w=0,add=0;
        for(int x=0,y=0;x<n;x++,y^=1)
        {
            add=x*s[y][x]+f[y][x][1]+(x+n)*s[!y][x]+f[!y][x][0];
            ans=max(ans,w+add);
            w+=(ll)g[y][x]*2*x+(ll)g[!y][x]*(2*x+1);
        }
        printf("%I64d
    ",ans);
        return 0;
    }
    View Code

    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    int const maxn=3e5+5;
    int n,g[3][maxn];
    ll s[3][maxn],f[3][maxn][3],ans;
    void dfs(int x,int y,ll w)
    {
        if(x==n)return;
        ll t=2*x,tt=t+n-x;
        ans=max(ans,w+t*s[y][x+1]+f[y][x+1][1]+tt*s[!y][x+1]+f[!y][x+1][0]);
        dfs(x+1,y^1,w+(ll)(t+1)*(g[0][x+1]+g[1][x+1])+g[!y][x+1]);
    }
    int main()
    {
        cin>>n;
        for(int i=1;i<=n;i++)cin>>g[0][i];
        for(int i=1;i<=n;i++)cin>>g[1][i];
        for(int j=0;j<=1;j++)
        {
            for(int i=n,k=1;i;i--,k++)
            {
                f[j][i][0]=f[j][i+1][0]+(ll)k*g[j][i];//<-
                s[j][i]=s[j][i+1]+g[j][i];
            }
            for(int i=n;i;i--)
            {
                f[j][i][1]=f[j][i+1][1]+s[j][i];//->
            }
        }
        dfs(0,0,0);
        cout<<ans-s[1][1]-s[0][1];
        return 0;
    }
  • 相关阅读:
    Centos7.0 安装Oralce 11g数据库
    python学习:基础数据类型
    Centos7.0 安装MySQL数据库
    Centos7.0 安装MariaDB数据库
    微服务的详情
    Class -- 10 -- Method类常用方法解析
    遍历list的三种方式
    使用@Autowired注解警告Field injection is not recommended
    java中的两种排序工具Arrays和Collections的使用
    java的reflection和introspector
  • 原文地址:https://www.cnblogs.com/Zinn/p/9483853.html
Copyright © 2011-2022 走看看