Slope optimization DP... An example of the application of the combination of data and shapes in the competition of informatics in Wuhu, Anhui Province, China...
Best cow fences
Time limit:1000 ms |
|
Memory limit:30000 K |
Total submissions:9311 |
|
Accepted:2986 |
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 <= 2000.
FJ wants to build a fence around a contiguous group of these fields in order to maximize the average number of cows per field within that block. the block must contain at least F (1 <= F <= N) fields, where F given as input.
Calculate the fence placement that maximizes the average, given the constraint.
Input * Line 1: two space-separated integers, N and F.
* Lines 2 .. n + 1: Each line contains a single integer, the number of cows in a field. line 2 gives the number of cows in Field 1, line 3 gives the number in Field 2, and so on.
Output * Line 1: A single integer that is 1000 times the maximal average. do not perform rounding, just print the integer that is 1000 * ncows/nfields.
Sample Input 10 66 4210385941 Sample output 6500 Source Usaco 2003 March green |
[Submit] [Go Back] [Status] [discuss]
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn=100100;int sum[maxn],n,f;int stack[maxn],top;bool cmp(int a,int b,int c){ int x1,x2,y1,y2; y1=sum[b]-sum[a]; x1=b-a; y2=sum[c]-sum[b]; x2=c-b; return y1*x2-y2*x1<=0;}double calu(int a,int b){ return (double)(sum[b]-sum[a])/(double)(b-a);}int main(){ while(scanf("%d%d",&n,&f)!=EOF) { double ans=0.; for(int i=1;i<=n;i++) { int x; scanf("%d",&x); sum[i]=sum[i-1]+x; } top=0; for(int i=0;i<=n-f;i++) { while(top>=1&&cmp(stack[top-1],stack[top],i)==false) top--; stack[++top]=i; int j=top; while(j>=1&&cmp(stack[j-1],stack[j],i+f)==false) j--; ans=max(ans,calu(stack[j],i+f)); } printf("%d\n",(int)(ans*1000)); } return 0;}