[ZOJ 3607] Lazier Salesgirl

题目链接: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);
    }
}
上一篇:洛谷 P4016 负载平衡问题 - 贪心、数学


下一篇:poj2018 Best Cow Fences[二分答案or斜率优化]