zoukankan      html  css  js  c++  java
  • 牛客网-数学考试-(dp+前缀和)

    链接:https://ac.nowcoder.com/acm/problem/15553
    来源:牛客网

    题目描述

    今天qwb要参加一个数学考试,这套试卷一共有n道题,每道题qwb能获得的分数为ai,qwb并不打算把这些题全做完,
    他想选总共2k道题来做,并且期望他能获得的分数尽可能的大,他准备选2个不连续的长度为k的区间,
    即[L,L+1,L+2,....,L+k-1],[R,R+1,R+2,...,R+k-1](R >= L+k)。

    输入描述:

    第一行一个整数T(T<=10),代表有T组数据
    接下来一行两个整数n,k,(1<=n<=200,000),(1<=k,2k <= n)
    接下来一行n个整数a1,a2,...,an,(-100,000<=ai<=100,000)

    输出描述:

    输出一个整数,qwb能获得的最大分数
    示例1

    输入

    2
    6 3
    1 1 1 1 1 1
    8 2
    -1 0 2 -1 -1 2 3 -1

    输出

    6
    7

    思路:连续的区间,显然要用前缀和,暴力解法遍历一次中心点,再遍历左右两边最大的连续区间,O(n2)

    用动态规划维护中点i的左右两边最大连续区间,寻找最大和。、

    需要注意的是,一旦i被左边用了,就不能算在右边区间里。

    #include<stdio.h>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<math.h>
    #include<string>
    #include<map>
    #include<queue>
    #include<stack>
    #include<set>
    #include<ctime>
    #define ll long long
    #define inf 0x3f3f3f3f ///填充无限小-0x7f
    
    const double pi=3.1415926;
    const double eps=1e-9;
    const ll p=1e9+7;
    using namespace std;
    
    int n,k;
    ll dpl[200005],dpr[200005];
    ll a[200005],sum[200005];
    
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&n,&k);
            for(int i=1;i<=n;i++)
            {
                scanf("%lld",&a[i]);
                sum[i]=sum[i-1]+a[i];
            }
            memset(dpl,-0x7f,sizeof(dpl));
            memset(dpr,-0x7f,sizeof(dpr));
            ///dpl[i]表示i左边包括i这段区间 最大的连续区间是多大
            ///dpr[i]表示i右边这段区间 最大的连续区间是多大
            /// 1 2 3 4 5 6 7
            ///n=7 k=2
    
            for(int i=k;i<=n-k;i++)
                dpl[i]=max(dpl[i-1],sum[i]-sum[i-k]);///sum[2]-sum[0]=[1,2]=dpl[2]
    
            for(int i=n-k;i>=k;i--)
                dpr[i]=max(dpr[i+1],sum[i+k]-sum[i]);///sum[7]-sum[5]=[6,7]=dpr[5]
            ///左边有算i,右边没算i
            ll ans=-1e18;
            for(int i=k;i<=n-k;i++)
                ans=max(ans,dpl[i]+dpr[i]);
            printf("%lld
    ",ans);
        }
    
        return 0;
    }
  • 相关阅读:
    DataImport(译)
    Spring JDBC最佳实践(1)
    在Spring中快速使用EHCache注解
    VS 2010 WPF核心是哪些功能特性 ?
    [你必须知道的.NET]第十五回:继承本质论
    C#设置本地网络(DNS、网关、子网掩码、IP)
    [你必须知道的.NET]第十六回:深入浅出关键字using全接触
    逆变与协变
    C# 判断网站是否能访问或者断链
    接口与抽象类
  • 原文地址:https://www.cnblogs.com/shoulinniao/p/12631892.html
Copyright © 2011-2022 走看看