lightoj 1275 - Internet Service Providers 【求导】

来源:互联网 发布:白凡泄露天机知乎 编辑:程序博客网 时间:2024/05/16 01:38
1275 - Internet Service Providers
PDF (English)StatisticsForum
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

 



题意:给你函数式 f(T) = T*(C - T*N) 以及 C和N的值,问F(T)最大时 的最小T值。

很简单吧,对函数式求导,然后令导函数为0,找满足条件的最小的T。注意N为0时T为0。

AC代码:


#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#include <algorithm>#include <queue>#include <stack>#include <map>#include <vector>#define INF 0x3f3f3f3f#define eps 1e-8#define MAXN 500000+10#define MAXM 50000000#define Ri(a) scanf("%d", &a)#define Rl(a) scanf("%lld", &a)#define Rs(a) scanf("%s", a)#define Pi(a) printf("%d\n", (a))#define Pl(a) printf("%lld\n", (a))#define Ps(a) printf("%s\n", (a))#define W(a) while(a--)#define CLR(a, b) memset(a, (b), sizeof(a))#define MOD 1000000007#define LL long longusing namespace std;int main(){    int t, kcase = 1;    Ri(t);    W(t)    {        LL N, C;        Rl(N); Rl(C);        LL ans;        if(N == 0)            ans = 0;        else if(C % (2*N) == 0)            ans = C / 2 / N;        else        {            LL a = C / 2 / N;            LL b = a + 1;            if(a*(C-a*N) >= b*(C-b*N))                ans = a;            else                ans = b;        }        printf("Case %d: %lld\n", kcase++, ans);    }    return 0;}


0 0
原创粉丝点击