
View Code
1 //==================================================================== 2 //Name :hdu 2993 MAX Average Problem 3 //Author :hxf 4 //copyright :http://blog.sina.com.cn/u/2904525152 5 //Description:动态规划DP斜率优化 6 //Data :2012.7.17 7 //======================================================================== 8 #include <iostream> 9 #include "stdio.h" 10 #include<algorithm> 11 #define LEN 100001 12 using namespace std; 13 int temp[LEN],head,tail;//用来控制判断图上点的取舍 14 ///////////////////////////// 15 int GetInt(){/////////////////这里是读入外挂(没这个这题貌似AC不掉) 16 char ch=getchar(); 17 while(ch<'0'||ch>'9')ch=getchar(); 18 int num=0; 19 while(ch>='0'&&ch<='9'){ 20 num=num*10+ch-'0'; 21 ch=getchar(); 22 } 23 return num; 24 } 25 //////////////////// 26 void solve(int n,int k) 27 { 28 double sum[LEN];//用来保存部分和 29 memset(sum,0,sizeof(sum)); 30 sum[0]=0; 31 for(int i=1;i<=n;i++) 32 { 33 int x=0; 34 //scanf("%d",&x); 35 x=GetInt(); 36 sum[i]=sum[i-1]+x; 37 } 38 //////////////////////////////////输入完成 39 memset(temp,0,sizeof(temp)); 40 temp[0]=0;head=0;tail=0; 41 double max=0; 42 //////////////////具体实现优化 43 for(int i=k;i<=n;i++) 44 { 45 int now=i-k; 46 while(head<tail) 47 { 48 double k1=(sum[temp[tail]]-sum[temp[tail-1]])/(temp[tail]-temp[tail-1]); 49 double k2=(sum[now]-sum[temp[tail]])/(now-temp[tail]); 50 if(k1>=k2) 51 tail--; 52 else 53 break;//去掉向上凸出来的点 54 } 55 ////////////////////////////////// 56 tail++; 57 temp[tail]=now; 58 /////////////////////////////// 59 while(head<tail) 60 { 61 double k1=(sum[temp[head]]-sum[i])/(temp[head]-i); 62 double k2=(sum[temp[head+1]]-sum[i])/(temp[head+1]-i); 63 if(k1<=k2) 64 head++;//下凸线中去掉斜率较小的点(从左往右) 65 else 66 break; 67 } 68 double t=(sum[temp[head]]-sum[i])/(temp[head]-i); 69 if(t>max) 70 max=t; 71 } 72 printf("%.2lf\n",max); 73 } 74 int main() 75 { 76 int n=0,k=0; 77 while(scanf("%d%d",&n,&k)!=EOF) 78 { 79 solve(n,k); 80 } 81 return 0; 82 }
现在来分析解题思路:


维护下凸折线
第一次发算法的贴,实在经验不足,若是写的不好,大家多多指教哈~
转载于:https://www.cnblogs.com/Free-rein/archive/2012/08/09/2630190.html
2554



被折叠的 条评论
为什么被折叠?



