题目链接: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;
}
本文深入探讨了ZOJ3607 LazierSalesgirl题目的解决策略,首先计算每个人能购买面包的最小间隔,接着遍历此数组寻找平均售出面包数量最大的间隔,最终输出最优间隔与平均值。
657

被折叠的 条评论
为什么被折叠?



