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

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 
 
3
2
200 100 100
3
10000 3000 4000 5000
5
3000 100 100 100 100 100

Case #1: 0.000000000000
Case #2: 0.088963394693
Case #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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值