hdoj MAX Average Problem 2993 (斜率优化DP)

来源:互联网 发布:如何安装python 编辑:程序博客网 时间:2024/06/07 15:59

MAX Average Problem

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7613    Accepted Submission(s): 1667


Problem Description
Consider a simple sequence which only contains positive integers as a1, a2 ... an, and a number k. Define ave(i,j) as the average value of the sub sequence ai ... aj, i<=j. Let’s calculate max(ave(i,j)), 1<=i<=j-k+1<=n.
 

Input
There multiple test cases in the input, each test case contains two lines.
The first line has two integers, N and k (k<=N<=10^5).
The second line has N integers, a1, a2 ... an. All numbers are ranged in [1, 2000].
 

Output
For every test case, output one single line contains a real number, which is mentioned in the description, accurate to 0.01.
 

Sample Input
10 66 4 2 10 3 8 5 9 4 1
 

Sample Output
6.50
//思路:http://www.docin.com/p-47950655.html
一种新思想。。。
//看网上的都是TLM。。。先贴上。。。
#include<stdio.h>#include<string.h>#include<algorithm>#define INF 0x3f3f3f3f#define ll long long#define N 100010using namespace std;int sum[N],s[N],a[N];bool cross(int i,int j,int k){if((sum[j]-sum[i])*(k-i)>=(sum[k]-sum[i])*(j-i))return true;return false;}double fx(int i,int t){double tmp;tmp=1.0*(sum[t]-sum[i])/(t-i);return tmp;}int main(){int n,k;int i;while(scanf("%d%d",&n,&k)!=EOF){sum[0]=0;for(i=1;i<=n;i++){scanf("%d",&a[i]);sum[i]=sum[i-1]+a[i];}int top=0,low=0;double ans=0;for(i=k;i<=n;i++){int j=i-k;while(top-low>=1&&cross(s[top-1],s[top],j))top--;s[++top]=j;while(top-low>=1&&fx(s[low+1],i)>=fx(s[low],i))low++;ans=max(ans,fx(s[low],i));}printf("%.2lf\n",ans);}return 0;}

0 0
原创粉丝点击