NYoj 666内部収益率二分
2228 ワード
タイトル:
内部収益率
時間制限:1000 ms|メモリ制限:65535 KB
難易度:3
説明
金融では、内部収益率IRRを使用してプロジェクトの投資財務効果を評価することがあります.これは、投資純現在価値NPVを0に等しくする割引率に等しいです.言い換えれば、所与の項目の期間数T、初期キャッシュフローCF 0および項目の各期間のキャッシュフローCF 1,CF 2,…,CFT,IRRは次の式の解である.
簡単にするために、本題は、プロジェクトの開始時に投入された(すなわち、初期キャッシュフローCF 0<0)を除いて、残りの各期間がお金を稼ぐことができる(すなわち、すべてのi=1,2,...,T,Cfi>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 9
0
サンプル出力
1.00
0.50
ソース
湖南省第6回大学生コンピュータプログラム設計コンテスト
テーマ:
式のすべてのcfの値をあげて、IRRの値を求めます(-1----正は無限です)、IRRの成立する値を求めます
テーマ構想:
q=irr+1を設定:
1、だって.q(0---正無限).したがってcf和は単調に減少するので,複数の解は存在しない.
2,Cf和は(正無限----0)であるため,無解は存在しない.
3、解く範囲が広すぎるので、二分法で、
プログラム:
内部収益率
時間制限:1000 ms|メモリ制限:65535 KB
難易度:3
説明
金融では、内部収益率IRRを使用してプロジェクトの投資財務効果を評価することがあります.これは、投資純現在価値NPVを0に等しくする割引率に等しいです.言い換えれば、所与の項目の期間数T、初期キャッシュフローCF 0および項目の各期間のキャッシュフローCF 1,CF 2,…,CFT,IRRは次の式の解である.
簡単にするために、本題は、プロジェクトの開始時に投入された(すなわち、初期キャッシュフローCF 0<0)を除いて、残りの各期間がお金を稼ぐことができる(すなわち、すべてのi=1,2,...,T,Cfi>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 9
0
サンプル出力
1.00
0.50
ソース
湖南省第6回大学生コンピュータプログラム設計コンテスト
テーマ:
式のすべてのcfの値をあげて、IRRの値を求めます(-1----正は無限です)、IRRの成立する値を求めます
テーマ構想:
q=irr+1を設定:
1、だって.q(0---正無限).したがってcf和は単調に減少するので,複数の解は存在しない.
2,Cf和は(正無限----0)であるため,無解は存在しない.
3、解く範囲が広すぎるので、二分法で、
プログラム:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cctype>
using namespace std;
#define maxn 10100
int a[maxn];
int main()
{
int n;
while(scanf("%d",&n)&&n)
{
int sum=0;
for(int i=0; i<=n; i++)
scanf("%d",&a[i]);
a[0]*=-1;
double low=0,p=1,high=1e6;
while(fabs(high-low)>0.0001)
{//jilu
double ans=0,t=1.0;
p=(low+high)/2;
for(int i=1;i<=n;i++)
{
t*=p;
ans+=a[i]/t;
}
//cout<<'!'<<low<<'\t'<<p<<'\t'<<high<<'\t'<<ans<<endl;
if(ans<a[0])
high=p;
else
low=p;
}
p=p-1;
printf("%.2lf
",p);
}
return 0;
}