这道题目我一开始的思路是用二维DP,结果TLE了。后来换了个思路,终于AC了。
不需要判断所有的情况,我们用dp[i]表示前i个牛圈中最大的牛数,而这个i首先必须>=限制的牛圈树f。用num[i]表示dp[i]中包含了多少牛圈。
我们可以知道,dp[i] = sum[i] - sum[i-f])/f or dp[i-1] + data[i], 前一个代表到i为止前f个牛圈的牛数,后一个代表前i-1个牛圈中最大牛数+第i个牛圈中的牛数。其实也就是到i为止前num[i-1]+1个牛圈的牛数。而判断取哪个的条件是判断(sum[i]
- sum[i-f]))/f和dp[i-1] + data[i]/(num[i-1]+1)的大小。
#include<stdio.h> #include<algorithm> #define max(x,y)(x>y?x:y) #define MAX 100002 double dp[MAX],data[MAX],num[MAX],sum[MAX]; int main(){ int i,n,f; double maxval; scanf("%d %d",&n,&f); for(i=1;i<=n;i++) { scanf("%lf",&data[i]); sum[i] = data[i] +sum[i-1]; num[i] = f; } dp[f] = sum[f]; maxval = dp[f]*1000/f; for(i=f+1;i<=n;i++){ if ((sum[i] - sum[i-f])/f > (dp[i-1] + data[i])/ (num[i-1] +1)){ dp[i] = sum[i] - sum[i-f]; num[i] = f; } else{ dp[i] = dp[i-1] + data[i]; num[i] = num[i-1] +1; } maxval = max(maxval,dp[i]*1000/num[i]); } printf("%d\n",(int)(maxval)); }
时间: 2024-10-12 10:37:34