描述
出题人想不到这题出什么好了,所以出题人摆烂了。
现给出出题人在n个连续时刻的精力,出题人决定连续摆烂m个时刻,求出题人在哪个时刻开始摆烂可以使他浪费的精力最少,并输出浪费的最少精力。
输入
第一行两个整数n,m。表示现在有n个时刻,出题人连续摆烂m个时刻(0<n<=1000000,0<m<=n)。
第二行n个整数ai,表示出题人在第i个时刻的精力。(0<=ai<=100)
输出
输出两个整数,摆烂的最佳时刻以及摆烂浪费的最少精力。中间用空格隔开,如果有多个最佳时刻请输出最小的那一个,因为出题人想尽快开摆。
输入
5 3 1 2 3 4 5
输出
1 6
提示
样例解释:从时刻1开始摆烂,摆烂1、2、3共3个时刻,浪费的总精力为a[1]+a[2]+a[3]=6。
有点像最大连续子序列的问题,但是这题并不是,首先是最少,其次已经给定了序列长度,所以也就意味着这题将会比最大连续子序列简单,介于本题的数据范围,常规暴力肯定是不行,所以这就需要前缀和来进行优化,这就会使时间复杂度降为O(n)
//#include <stdio.h>
#include <bits/stdc++.h>
//#define ll long long
#define ull unsigned long long
const int N=5000100;
const double pi=acos(-1.0);
using namespace std;
int a[N],n,m,aa=N,pp=-1;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
a[i]+=a[i-1];
}
for(int i=m;i<=n;i++){
if(a[i]-a[i-m]<aa){
aa=a[i]-a[i-m];
pp=i-m+1;
}
}
cout<<pp<<" "<<aa;
return 0;
}