2018年長沙理工大學第十三屆程式設計競賽 H-數學考試_競賽

來源:互聯網
上載者:User
連結: https://www.nowcoder.com/acm/contest/96/H
來源:牛客網

題目描述 今天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能獲得的最大分數

題解:dp1[i],dp2[i+1]儲存從i切割後左右兩段所能取得的最大值。根據遞推式求出dp1,dp2後枚舉切點即可。代碼:#include<bits/stdc++.h>using namespace std;#define ll long longconst int maxn=200005;ll a[maxn],sum1[maxn],sum2[maxn],dp1[maxn],dp2[maxn];int main(){    int T;scanf("%d",&T);    while(T--)    {        int n,k;scanf("%d%d",&n,&k);        for(int i=0;i<=n+1;i++)            dp1[i]=dp2[i]=-1e18;        sum1[0]=sum2[n+1]=0;        for(int i=1;i<=n;i++)        {            scanf("%lld",&a[i]);            sum1[i]=sum1[i-1]+a[i];            if(i>k)sum1[i]-=a[i-k];            if(i==k)dp1[i]=sum1[i];            else dp1[i]=max(sum1[i],dp1[i-1]);        }        for(int i=n;i>=1;i--)        {             sum2[i]=sum2[i+1]+a[i];            if(n-i>=k)sum2[i]-=a[i+k];            if(n-i<k)dp2[i]=sum2[i];            else dp2[i]=max(dp2[i+1],sum2[i]);        }        ll ma=-1e18;        for(int i=k;i+k<=n;i++)            ma=max(dp1[i]+dp2[i+1],ma);        printf("%lld\n",ma);    }    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.