题目链接:ZOJ 3607 Lazier Salesgirl
先把每个人可以买到面包的最小的w值算出来(一定是某两个客人到来时间的间隔),组成一个数组,然后遍历这个数组,寻找哪个w对应的average value of sold bread最大。
#include <iostream>
#include <stdio.h>
#include <cmath>
using namespace std;
const int MAX_N = 1000 + 100;
int p[MAX_N], t[MAX_N], w[MAX_N];
int T, n;
int main()
{
cin >> T;
while(T--)
{
cin >> n;
for(int i = 0; i < n; i++)
cin >> p[i];
for(int i = 0; i < n; i++)
cin >> t[i];
w[0] = t[0];
for(int i = 1; i < n; i++)
w[i] = max(t[i] - t[i - 1], w[i - 1]);
double _w, sum, ave, time;
int num;
ave = 0;
for(int i = 0; i < n; i++)
{
time = w[i];
sum = 0;
int j;
for(j = 0; j < n; j++)
{
if(time >= w[j])
sum += p[j];
else
break;
}
if(ave < sum / j)
{
ave = sum / j;
_w = time;
}
}
printf("%.6lf %.6lf\n", _w, ave);
}
return 0;
}