FZU_Problem 2168 防守陣地 I

來源:互聯網
上載者:User

標籤:預先處理

Problem 2168 防守陣地 I Accept: 128 Submit: 392
Time Limit: 3000 mSec Memory Limit : 32768 KB Problem Description

部隊中共有N個士兵,每個士兵有各自的能力指數Xi,在一次演練中,指揮部確定了M個需要防守的地點,按重要程度從低到高排序,依次以數字1到M標註每個地點的重要程度,指揮部將選擇M個士兵依次進入指定地點進行防守任務,能力指數為X計程車兵防守重要程度為Y的地點將得到X*Y的參考指數。現在士兵們排成一排,請你選擇出連續的M個士兵依次參加防守,使得總的參考指數值最大。

Input

輸入包含多組資料。

輸入第一行有兩個整數N,M(1<=N<=1000000,1<=M<=1000),第二行N個整數表示每個士兵對應的能力指數Xi(1<=Xi<=1000)。

對於30%的資料1<=M<=N<=1000。

Output

輸出一個整數,為最大的參考指數總和。

Sample Input5 32 1 3 1 4 Sample Output17 //假設選前1-m個士兵當前能力指數x為1*a[1]+2*a[2]+3*a[3]+.....+m*a[m],那麼容易得出前2-m+1個士兵的能力指數y為:x+a[m+1]*m-(a[1]+a[2]+.....a[m]);後面這個只要輸入時預先處理一下就行,這樣就枚舉出連續m個士兵的所有情況,然後取最大值。 
#include<cstdio>#include<algorithm>using namespace std;#define maxn 1000010int a[maxn],b[maxn];int main(){    int n,m,i;    __int64 ans,x,temp;    while(scanf("%d%d",&n,&m)!=EOF)    {        ans=0;        for(i=1;i<=n;i++)        {            scanf("%d",&a[i]);            b[i]=b[i-1]+a[i]; //儲存前i個數的和            if(i<=m) ans+=a[i]*i;  //1-m個士兵的能力指數        }        x=ans;        for(i=m+1;i<=n;i++)        {            temp=x+(m+1)*a[i]; //多加一次a[i]            temp-=b[i]-b[i-m-1]; //因為b[i]包含了a[i],等於這多減了一次,所以上面多加一次            x=temp; //傳遞到下一階段            ans=max(temp,ans); //不斷更新取最大值        }        printf("%I64d\n",ans);    }    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.