和HDU 2993一样,两个题都很纠结啊。这个题调了好几天。。。终于在多次WA终于AC了。各种错误,判断条件写错,dp数组的初始值。HDU那个题还要手写读入,890ms水过了。这个题放到图上很直观了,网上有各种解释。。。
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #define N 500001 5 __int64 dp[N],que[N],p[N],sum[N]; 6 int i,m; 7 double slope(int x,int y) 8 { 9 return ((i+m-y)*sum[x-1]-(i-x+m)*sum[y-1])*1.0/(x-y); 10 } 11 int main() 12 { 13 int n,str,end; 14 __int64 max; 15 scanf("%d%d",&n,&m); 16 17 for(i = 1; i <= n; i ++) 18 { 19 scanf("%I64d",&p[i]); 20 sum[i] = p[i]+sum[i-1]; 21 } 22 str = end = 0; 23 for(i = 1; i <= n-m+1; i ++) 24 { 25 dp[i+m-1] = 1000*(sum[i+m-1] - sum[i-1])/m; 26 while(str < end&& sum[i+m-1]>= slope(que[str],que[str+1])) 27 str ++; 28 if(dp[i+m-1] < 1000*(sum[i+m-1] - sum[que[str]-1])/(i+m-que[str])) 29 dp[i+m-1] = 1000*(sum[i+m-1] - sum[que[str]-1])/(i+m-que[str]); 30 while(str < end&&slope(que[end-1],que[end]) >= slope(que[end],i)) 31 end --; 32 end ++; 33 que[end] = i; 34 } 35 max = 0; 36 for(i = m; i <= n; i ++) 37 if(max < dp[i]) 38 max = dp[i]; 39 printf("%I64d\n",max); 40 return 0; 41 }