http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=3607
一个卖咖啡的人,一天有n个顾客,卖给第i个顾客赚取的钱是pi,
每个人来的时间是ti
这个老板有个缺点,卖完给一个人后会休息X时间,如果X时间内没有任何顾客来,则老板就睡一整天,打烊了,再也不能赚钱。
让你找出最小的X(时间间隔) 得到最大的平均赚的钱
显然最大平均钱下的最小W一定是相邻顾客的时间间隔,
对于顾客i 到顾客i+1来的时间间隔为Y,假设能一直做到第j个顾客,然后在等待下一个顾客来的时候睡着了。如果这个时候泥要扩大Y,只要Y小于 dis(j,j+1),得到的平均钱数都是一样的。因此最小的答案一定是相邻顾客的间隔 。
暴力枚举就好。。当然显然Y应该越来越大,判断一下更好
#include <cstdio> #include <cmath> #include <cstring> #include <string> #include <algorithm> #include <iostream> #include <queue> #include <map> #include <set> #include <vector> #include<cstdlib> using namespace std; int pp[1005]; int tt[1005]; int n; vector<int > dis; double cal(int x) { double ret=0; int i; for ( i=1;i<=n;i++) { if (tt[i]-tt[i-1]<=x) ret+=pp[i]; else { break; } } return ret/=i-1; } int main() { //freopen("input.txt","r",stdin); int t; scanf("%d",&t); while (t--) { dis.clear(); cin>>n; int i,j; for (i=1;i<=n;i++) scanf("%d",&pp[i]); for (i=1;i<=n;i++) { scanf("%d",&tt[i]); dis.push_back(tt[i]-tt[i-1]); } double ans=0; double answ=0; for (i=0;i<dis.size();i++) { double ret= cal(dis[i]); if (ret>ans) { ans=ret; answ=dis[i]; } } printf("%.6lf %.6lf\n",answ,ans); } return 0; }