Description
Kochiya Sanae is a lazy girl who makes and sells bread. She is an expert at bread making and selling. She can sell the i-th customer a piece of bread for price pi. But she is so lazy that she will fall asleep if no customer comes to buy bread for more than w minutes. When she is sleeping, the customer coming to buy bread will leave immediately. It's known that she starts to sell bread now and the i-th customer come after ti minutes. What is the minimum possible value of w that maximizes the average value of the bread sold?
Input
There are multiple test cases. The first line of input is an integer T ≈ 200 indicating the number of test cases.
The first line of each test case contains an integer 1 ≤ n ≤ 1000 indicating the number of customers. The second line contains n integers 1 ≤ pi ≤ 10000. The third line contains n integers 1 ≤ ti ≤ 100000. The customers are given in the non-decreasing order of ti.
Output
For each test cases, output w and the corresponding average value of sold bread, with six decimal digits.
Sample Input
2 4 1 2 3 4 1 3 6 10 4 4 3 2 1 1 3 6 10
Sample Output
4.000000 2.500000 1.000000 4.000000
贪心策略:
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
double k[2110],p[2110],w[2110];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,i,j;
scanf("%d",&n);
for(i=1; i<=n; i++)
scanf("%lf",&k[i]);
for(i=1; i<=n; i++)
scanf("%lf",&p[i]);
w[1]=p[1];
for(i=2; i<=n; i++)
{
if((p[i]-p[i-1])>w[i-1])
w[i]=p[i]-p[i-1];
else
w[i]=w[i-1];
}
double maxf=0,maxn=0,kw,sum=0;
for(i=1; i<=n; i++)
{
kw=w[i];
sum=0;
for(j=1; j<=n; j++)
{
if(kw >= w[j])
sum += k[j];
else
break;
}
if(maxn < sum /(j-1))
{
maxn=sum/(j-1);
maxf=kw;
}
}
printf("%.6lf %.6lf\n",maxf,maxn);
}
return 0;
}