poj 动态规划DP - 2018 Best Cow Fences

这道题目我一开始的思路是用二维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

poj 动态规划DP - 2018 Best Cow Fences的相关文章

POJ 2018 Best Cow Fences

斜率优化DP...<浅谈数形结合思想在信息学竞赛中的应用 安徽省芜湖一中 周源>例题... Best Cow Fences Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 9311   Accepted: 2986 Description Farmer John's farm consists of a long row of N (1 <= N <= 100,000)fields. Each field c

POJ 2018 Best Cow Fences(二分答案)

POJ 2018 Best Cow Fences(二分答案) Best Cow Fences Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 12144 Accepted: 3958 Description Farmer John's farm consists of a long row of N (1 <= N <= >100,000)fields. Each field contains a certain nu

POJ 2018 Best Cow Fences(二分最大区间平均数)题解

题意:给出长度>=f的最大连续区间平均数 思路:二分这个平均数,然后O(n)判断是否可行,再调整l,r.判断方法是,先求出每个数对这个平均数的贡献,再求出长度>=f的最大贡献的区间,如果这个最大贡献大于0说明这个二分出来的数可行. 代码: #include<set> #include<map> #include<stack> #include<cmath> #include<queue> #include<vector>

poj 动态规划DP - 2392 Space Elevator

背包九讲里面的多重背包问题.每一块积木有高度和数量,也有最大能到的高度位置限制.我们DP前首先要对高度限制进行排序,因为从直观角度说,我们也需要先处理较小的能到高度的积木,这样才能取到最大值.例如第一个高度是11,限制高度是100,第二个的限制高度是10,那如果直接处理,第二个不会被处理到. #include<stdio.h> #include<stdlib.h> #include<string.h> #define max(x,y)(x>y?x:y) struc

poj 动态规划DP - 1953 World Cup Noise

这一题其实就是斐波那契数列,但是我一开始用的是DP,不过应该思想差不多. 一数组dp[i][2],dp[i][0]代表前i个数里面最后一个数字为0的数量,dp[i][1]代表前i个数里面最后一个数字为1的数量,可知dp[i][1]+dp[i][0]就是前i个数能组成序列的数量. 这里因为不能2个1在一起,所以: dp[i][0] = dp[i-1][0]+dp[i-1][1] dp[i][1] = dp[i-1][0] #include<stdio.h> #include<string.

poj 动态规划题目列表及总结

此文转载别人,希望自己能够做完这些题目! 1.POJ动态规划题目列表 容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276,1322, 1414, 1456, 1458, 1609, 1644, 1664, 1690, 1699, 1740(博弈),1742, 1887, 1926(马尔科夫矩阵,求平衡), 1936, 1952, 1953, 1958, 1959, 1962, 1975,

poj 1458 动态规划DP

//  poj 1458  zoj 1733  最长公共子序列  DP #include <iostream>#include <string.h>#define N 1005using namespace std ;char  s1[N],s2[N];   int dp[N][N];int max(int a,int b)   {    return a>b ? a : b ;  }void f(int n,int m){   int i,j;    for (i=0; i

{POJ}{动态规划}

动态规划与贪心相关: {POJ}{2479}{Maximum Sum} (DP) 摘要: 题意:给定n个数,求两段连续子列的最大和.思路:先从左向右dp,求出一段连续子列的最大和,再从右向左dp,求出两段连续子列的最大和,方法还是挺经典的. {POJ}{1036}{Gansters} (DP) 摘要: 题意:有个伸缩门,门的宽度0~K,每个时间可以伸长或缩短1个单位,有N个流氓,他们在T时刻到达,如果这时门的宽度正好与他们的stoutness相等时,便可获得一定的收入,问最大的收入是多少. 思路

POJ2018 Best Cow Fences

Best Cow Fences Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 11175   Accepted: 3666 Description Farmer John's farm consists of a long row of N (1 <= N <= 100,000)fields. Each field contains a certain number of cows, 1 <= ncows <