您的位置:首页 > 其它

ZOJ 3607 Lazier Salesgirl(贪心啊 )

2015-04-19 21:32 393 查看
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4710

Kochiya Sanae is a lazy girl who makes and sells bread. She is an expert at bread making and selling. She can sell the i-th customer a piece of bread for price pi.
But she is so lazy that she will fall asleep if no customer comes to buy bread for more than w minutes. When she is sleeping, the customer coming to buy bread will leave immediately. It's known that she starts to sell bread now and the i-th
customer come after ti minutes. What is the minimum possible value of w that maximizes the average value of the bread sold?

Input

There are multiple test cases. The first line of input is an integer T ≈ 200 indicating the number of test cases.
The first line of each test case contains an integer 1 ≤ n ≤ 1000 indicating the number of customers. The second line contains n integers 1 ≤ pi ≤
10000. The third line contains n integers 1 ≤ ti ≤ 100000. The customers are given in the non-decreasing order of ti.

Output

For each test cases, output w and the corresponding average value of sold bread, with six decimal digits.

Sample Input

2
4
1 2 3 4
1 3 6 10
4
4 3 2 1
1 3 6 10

Sample Output

4.000000 2.500000
1.000000 4.000000


Author: WU, Zejun

Contest: The 9th Zhejiang Provincial Collegiate Programming Contest

代码如下:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int max(int a, int b)
{
	if(a > b)
	{
		return a;
	}
	return b;
}
int main()
{
	int T;
	int n;
	int p[1017], t[1017];
	scanf("%d",&T);
	while(T--)
	{
		int i, j;
		scanf("%d",&n);
		for(i = 0;  i < n; i++)
		{
			scanf("%d",&p[i]);
		}
		for(i = 0;  i < n; i++)
		{
			scanf("%d",&t[i]);
		}
		int c[1017];
		c[0] = t[0];
		for(i = 1; i < n; i++)
		{
			c[i] = max(c[i-1], t[i]-t[i-1]);
		}
		double sum = 0;
		double w, ave = 0;
		for(i = 0; i < n; i++)
		{
			double tt = c[i];
			sum = 0;
			for(j = 0; j < n; j++)
			{
				if(tt >= c[j])
				{
					sum+=p[j];
				}
				else
				{
					break;
				}
			}
			if(sum/j > ave)
			{
				ave = sum/j;
				w = c[i];
			}
		}
		printf("%.6lf %.6lf\n",w,ave);
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: