[ACM_模拟][ACM_暴力] Lazier Salesgirl [暴力 懒销售睡觉]
Description
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
题目大意:T种情况,每种n个客人,第i个客人可赚p[i]元钱,第i个客人t[i]时间来,卖东西的很懒,如果w时间内没人来就睡觉,一觉不起,求最大人均赚的钱同时输出最小w.
解题思路:暴力枚举每次在第i个顾客来后睡。用w[i]保存想赚第i个人w的最小值,用av[i]保存赚前i个顾客的平均值。如果在第i个顾客来后睡觉就要满足w[i]<w[i+1](这个式子表明第i和第i+1个顾客之间的时间间隔比之前的都大,所以可以取w=w[i]来在这点后睡觉不醒)
1 #include<iostream> 2 #include<string.h> 3 #include<cstring> 4 #include<cstdio> 5 #include<string> 6 using namespace std; 7 int main(){ 8 int T;cin>>T; 9 while(T--){ 10 int n;cin>>n; 11 int p[1002],t[1002]; 12 //w[i]表示赚第i个人需要w的最小值;av[i]表示前i个的人均赚钱数 13 double w[1002],av[1002]; 14 double sum=0; 15 for(int i=0;i<n;i++){ 16 cin>>p[i]; 17 sum+=p[i]; 18 av[i]=sum/(i+1); 19 } 20 double max_w=-1; 21 for(int i=0;i<n;i++){ 22 cin>>t[i]; 23 if(i!=0){ 24 if(t[i]-t[i-1]>max_w){ 25 max_w=t[i]-t[i-1]; 26 w[i]=max_w; 27 }else w[i]=max_w; 28 } 29 else { 30 max_w=t[0]; 31 w[i]=max_w; 32 } 33 }w[n]=1312312313;//w[n]赋值很高 34 35 int pos=0;double max_av=-1;//暴力枚举在i点睡着 36 for(int i=0;i<=n;i++){ 37 if(w[i]<w[i+1]){ 38 if(av[i]>max_av){ 39 max_av=av[i]; 40 pos=i; 41 } 42 } 43 } 44 45 printf("%.6lf %.6lf\n",w[pos],av[pos]); 46 }return 0; 47 }