NBUT 1463内部収益率二分

1969 ワード

[1463]内部収益率時間制限:1000 msメモリ制限:65535 K 問題の説明金融では、内部収益率IRRを使用してプロジェクトの投資財務効果を評価することがあります.これは、投資純現在価値NPVを0に等しくする割引率に等しいです.言い換えれば、所与の項目の期間数T、初期キャッシュフローCF 0および項目の各期間のキャッシュフローCF 1,CF 2,…,CFT,IRRは次の式の解である.
簡単にするために、本題は、プロジェクトの開始時に投入された(すなわち、初期キャッシュフローCF 0<0)を除いて、残りの各期間がお金を稼ぐことができる(すなわち、すべてのi=1,2,...,T,Cpi>0)と仮定する.定義によれば、IRRは負数であってもよいが、−1より大きくてはならない.

入力入力ファイルは最大25組のテストデータを含み、各データは2行を占め、第1行は正の整数T(1<=T<=10)を含み、プロジェクトの期間数を表す.2行目はT+1個の整数を含む:CF 0,CF 1,CF 2,...,CF 0<0,0
出力各データセットについて、出力は1行のみ、すなわち項目のIRRであり、小数点以下の2桁を四捨五入する.IRRが存在しない場合は「No」を出力し、複数の異なるIRRが条件を満たす場合は「Too many」を出力する(いずれも引用符を含まない)

サンプル入力
1
-1 2
2
-8 6 90

サンプル出力
1.00
0.50

ヒント
 

ソース
                  

クリックしてタイトルリンクを開く
IRRに対して2分行って、題目の方程式は厳格で単調で、Too manyができないで、また
CF 0<0、残りの各期はすべて金を儲けることができて、No
#include 
#include 
using namespace std;

const int MAXN = 10 + 5;
double CF[MAXN];
int t;
int main()
{
    while (~scanf("%d", &t), t)
    {
        for (int i = 0 ; i <= t; i++) scanf("%lf", &CF[i]);
        double L = -1.0, R = 9999.0;

        for (int i = 0; i < 100; i++)   //  100 
        {
            double IRR = (L + R) / 2;
            double sum = 0;
            double den = 1;
            for (int i = 0; i <= t; i++)    //  NPV
            {
                sum += CF[i] / den;
                den *= (1 + IRR);
            }
            if (sum > 0) L = IRR;
            else R = IRR;
        }
        printf("%.2lf
", L); } return 0; }