Round A APAC Test 2017 Problem C. Jane's Flower Shop 二分、高精度要求

来源:互联网 发布:ipad淘宝在哪里看微淘 编辑:程序博客网 时间:2024/05/16 15:58

Problem C. Jane's Flower Shop

This contest is open for practice. You can try every problem as many times as you like, though we won't keep track of which problems you solve. Read the Quick-Start Guide to get started.
Small input
6 points
Judge's response for last submission: Correct.
Large input
19 points
Judge's response for last submission: Correct.

Problem

Jane plans to open a flower shop in the local flower market. The initial cost includes the booth license, furnishings and decorations, a truck to transport flowers from the greenhouse to the shop, and so on. Jane will have to recoup these costs by earning income. She has estimated how much net income she will earn in each of the following Mmonths.

Jane wants to predict how successful her flower shop will be by calculating the IRR (Internal Rate of Return) for the M-month period. Given a series of (time, cash flow) pairs (i, Ci), the IRR is the compound interest rate that would make total cash exactly 0 at the end of the last month. The higher the IRR is, the more successful the business is. If the IRR is lower than the inflation rate, it would be wise not to start the business in the first place.

For example, suppose the initial cost is $10,000 and the shop runs for 3 months, with net incomes of $3,000, $4,000, and $5,000, respectively. Then the IRR r is given by:

In this case, there is only one rate (~=8.8963%) that satisfies the equation.

Help Jane to calculate the IRR for her business. It is guaranteed that -1 < r < 1, and there is exactly one solution in each test case.

Input

The first line of the input gives the number of test cases, TT test cases follow. Each test case starts with a positive integer M: the number of months that the flower shop will be open. The next line contains M + 1 non-negative integers Ci (0 ≤ i ≤ M). Note that C0represents the initial cost, all the remaining Cis are profits, the shop will always either make a positive net profit or zero net profit in each month, and will never have negative profits.

Output

For each test case, output one line containing Case #x: y, where x is the test case number (starting from 1) and y is a floating-point number: the IRR of Jane's business. ywill be considered correct if it is within an absolute  or relative error of 10-9 of the correct answer. See the FAQ for an explanation of what that means, and what formats of real numbers we accept.

Limits

1 ≤ T ≤ 100.
C0 > 0.
0 ≤ Ci ≤ 1,000,000,000.

Small dataset

1 ≤ M ≤ 2.

Large dataset

1 ≤ M ≤ 100.

Sample


Input 
 
Output 
 
32200 100 100310000 3000 4000 500053000 100 100 100 100 100
Case #1: 0.000000000000Case #2: 0.088963394693Case #3: -0.401790748826
In sample case #1, the IRR is 0, Jane just paid back all the money and no interest.

Sample case #2 and #3 would only appear in Large dataset.
大概就是二分地查找答案,然而我精度开高居然还会wa。。。也是醉了。。。。

这题精度特别高。。。题目里给的样例用double根本都得不出0来。。。要开long double

但eps只用开1e-10,原先开了1e-14wa了好久。。。

代码:

#include <iostream>#include <cstring>#include <cstdio>#include <vector>#include <queue>#include <algorithm>#include <map>using namespace std;const long double eps = 1e-10;const int maxn = 110;int n;long double abs(long double x){    return x<0?-x:x;}long double save[maxn];long double Count(long double r){    int i,j;    long double res = 0.0;    for(i=0;i<=n;i++){        long double now = 1.0;        for(j=1;j<=n-i;j++){            now *= (1.0+r);        }        res += now*save[i];    }    return res;}int main(){    freopen("C-large-practice.in", "r", stdin);    freopen("out.txt", "w", stdout);    int t,i;    scanf("%d",&t);    int rnd = 1;    while(t--){        scanf("%d",&n);        for(i=0;i<=n;i++){            scanf("%Lf",save+i);        }        save[0] = -save[0];        long double left = -1.0,right = 1.0;        long double middle,now;        while(abs(left-right)>eps){            middle = (left+right)/2;            now = Count(middle);            if(now>0.0){                left = middle;            }else{                right = middle;            }        }        printf("Case #%d: %.12Lf\n",rnd++,middle);    }            return 0;}









0 0
原创粉丝点击