Time Limit: 2 second(s) | Memory Limit: 32 MB |
A group of N Internet Service Provider companies (ISPs) use a private communication channel that has a maximum capacity of C traffic units per second. Each company transfers T traffic units per second through the channel and gets a profit that is directly proportional to the factor T(C - T*N). The problem is to compute the smallest value of T that maximizes the total profit the N ISPs can get from using the channel. Notice that N, C, T, and the optimal T are integer numbers.
Input
Input starts with an integer T (≤ 20), denoting the number of test cases.
Each case starts with a line containing two integers N and C (0 ≤ N, C ≤ 109).
Output
For each case, print the case number and the minimum possible value of T that maximizes the total profit. The result should be an integer.
Sample Input | Output for Sample Input |
6 1 0 0 1 4 3 2 8 3 27 25 1000000000 | Case 1: 0 Case 2: 0 Case 3: 0 Case 4: 2 Case 5: 4 Case 6: 20000000
|
思路:求导加二分
1 #include<stdio.h> 2 #include<algorithm> 3 #include<iostream> 4 #include<stdlib.h> 5 #include<string.h> 6 #include<math.h> 7 #include<queue> 8 #include<set> 9 #include<stack> 10 #include<map> 11 #include<set> 12 using namespace std; 13 typedef long long LL; 14 LL ask(LL n,LL m, LL z) 15 { 16 return n*(z-n*m); 17 } 18 int main(void) 19 { 20 int i,j,k; 21 scanf("%d",&k); 22 int s; 23 for(s=1; s<=k; s++) 24 { 25 LL x,y; 26 scanf("%lld %lld",&x,&y); 27 LL l=-y; 28 LL r=y; 29 LL ac=0; 30 while(l<=r) 31 { 32 LL mid=(l+r)/2; 33 if(y-2*mid*x<=0) 34 { 35 ac=mid; 36 r=mid-1; 37 } 38 else l=mid+1; 39 } 40 LL ck=ac-1; 41 LL sum1=ask(ac,x,y); 42 LL sum2=ask(ac-1,x,y); 43 if(sum2>=sum1) 44 ac=ck; 45 printf("Case %d:",s); 46 printf(" %lld\n",ac); 47 } 48 return 0; 49 }