標籤:預先處理
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;}