FZU_Problem 2168 防守陣地 I
阿新 • • 發佈:2017-06-20
mit 兩個 ace art 指數 content rip strong space
Problem 2168 防守陣地 I
Accept: 128 Submit: 392
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 4Sample 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