ZOJ 3607 Lazier Salesgirl
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
贪心用map存储时间间隔。
只有两种情况:
如果后面的时间间隔比前面出现的最大的时间间隔还大的话,新建键值对存到map。
反之,在原来的最大时间间隔上进行处理。
1 #include <stdio.h> 2 #include <map> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 int n; 8 int cnt; 9 int sum[1100]; 10 map< double , double > M; 11 map< double , double >::iterator it; 12 13 struct Node{ 14 int p,t; 15 }nod[1100]; 16 17 bool cmp(Node n1, Node n2){ 18 return n1.t<n2.t; 19 } 20 21 int main(){ 22 int t; 23 int i,j; 24 scanf("%d",&t); 25 while( t-- ){ 26 scanf("%d" ,&n); 27 for(i=0; i<n; i++){ 28 scanf("%d" ,&nod[i].p); 29 } 30 for(i=0; i<n; i++){ 31 scanf("%d" ,&nod[i].t); 32 } 33 sort(nod ,nod+n ,cmp); 34 M.clear(); 35 for(i=0; i<n; i++){ 36 if(i==0){ 37 sum[i]=nod[i].p; 38 }else{ 39 sum[i]=sum[i-1]+nod[i].p; 40 } 41 } 42 cnt=nod[0].t; 43 M[cnt]=nod[0].p; 44 for(i=1; i<n; i++){ 45 if( nod[i].t-nod[i-1].t>cnt ){ 46 cnt=nod[i].t-nod[i-1].t; 47 M[cnt]=double(sum[i])/(i+1); 48 }else{ 49 M[cnt]=double(sum[i])/(i+1); 50 } 51 } 52 double w=0; 53 double maxValue=0; 54 for(it=M.begin(); it!=M.end(); it++){ 55 if( it->second > maxValue ){ 56 w=it->first; 57 maxValue=it->second; 58 } 59 } 60 printf("%.6lf %.6lf\n",w,maxValue); 61 } 62 return 0; 63 }