斜率优化DP。
这题是论文《浅
说说这题坑的地方,输出时如果用getchar()自己写输入的话要快大概500ms左右,存数的时候要用double,如果用int的话,就算算答案的时候乘以1.0再算也是wrong,这里贴个直接输入的代码吧。用C++AC时间大概是800ms。用G++超时。
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
#include <map>
#include <vector>
#include <cmath>
#include <stack>
#include <queue>
#include <cstdlib>
#include <algorithm>
using namespace std;
typedef __int64 int64;
typedef long long ll;
#define M 100005
#define N 1000005
#define max_inf 0x7f7f7f7f
#define min_inf 0x80808080
#define mod 1000000007
int n , k , q[M] , arr[M];
double sum[M];
void Solve()
{
int i , front , rear;
double ans = -1;
front = 0;
rear = 1;
q[0] = 0;
for (i = k ; i <= n ; i++)
{
int t = i-k;
while (rear > front+1)
{
double y1 = sum[t]-sum[q[rear-1]];
double x1 = t-q[rear-1];
double y2 = sum[q[rear-1]]-sum[q[rear-2]];
double x2 = q[rear-1]-q[rear-2];
if (y1*x2 <= y2*x1)rear--;
else break;
}
q[rear++] = t;
while (front+1 < rear)
{
double y1 = sum[i]-sum[q[front]];
double x1 = i-q[front];
double y2 = sum[i]-sum[q[front+1]];
double x2 = i-q[front+1];
if (y2*x1 >= y1*x2)front++;
else break;
}
double temp = (sum[i]-sum[q[front]])*1.0/(i-q[front]);
if (ans < temp)ans = temp;
}
printf("%.2lf\n",ans);
}
int main()
{
while (~scanf("%d%d",&n,&k))
{
int i;
for (arr[0] = sum[0] = 0 , i = 1 ; i <= n ; i++)
{
scanf("%d",arr+i);
sum[i] = sum[i-1]+arr[i];
}
Solve();
}
return 0;
}