1. 程式人生 > >FZU_Problem 2168 防守陣地 I

FZU_Problem 2168 防守陣地 I

mit 兩個 ace art 指數 content rip strong space

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 Input

5 3 2 1 3 1 4

技術分享 Sample Output

17 //如果選前1-m個士兵當前能力指數x為1*a[1]+2*a[2]+3*a[3]+.....+m*a[m],那麽easy得出前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 1000010
int 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;
}

FZU_Problem 2168 防守陣地 I