题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3607
思路:最小的相隔时间肯定是两个时间的间隔,只需要计算每个时间间隔所获的价值的平均值,取最大的平均值以及其对应的时间间隔即可,注意,当平均值相等的时候,取时间间隔小的。
AC 代码:
#include <cstdio>
#include <vector>
#include <iostream>
using namespace std;
const int maxn = 1005;
int test;
int n;
int p[maxn];
int t[maxn];
vector<int> distime;
double solve(int dis_t)
{
double ret = 0.0;
int i;
for(i = 1; i <= n; i++)
{
if(t[i]-t[i-1] <= dis_t)
ret += p[i];
else
break;
}
return ret / (i-1);
}
int main()
{
scanf("%d",&test);
while(test--)
{
distime.clear();
scanf("%d",&n);
for(int i = 1; i <= n; i++)
scanf("%d",&p[i]);
t[0] = 0;
for(int i = 1; i <= n; i++)
{
scanf("%d",&t[i]);
distime.push_back(t[i] - t[i-1]);
}
double ave,ans_distime,ans_ave = -1.0;
//for(vector<int>::iterator it = distime.begin();it != distime.end();it++)
for(int i = 0; i < distime.size(); i++)
{
ave = solve(distime[i]);
if(ave > ans_ave)
{
ans_distime = distime[i];
ans_ave = ave;
}
}
printf("%.6lf %.6lf\n",ans_distime,ans_ave);
}
}