依然是来自2017/9/17的周赛水题……
题目链接:https://cn.vjudge.net/problem/UVA-11881
题解:
观察这个函数:
由于CF[i]固定值,因此NPV(IRR)这个函数,是连续单减函数,其值域区间为从+∞到CF[0];
那么显然的,NPV(IRR) = 0方程的解必然有且仅有一个,所以题目中“Too many”和“No”的输出纯粹掩人耳目,实际上是不会有test case输出这两个的;
那么要得到IRR的一定精确度的数值,显然二分法求即可。
AC代码:
1 #include<cstdio> 2 #include<cmath> 3 int t,cf[13]; 4 double l,r,mid; 5 double ans; 6 double calc(double IRR) 7 { 8 double ans=cf[0]*1.0; 9 for(int i=1;i<=t;i++) ans+=(cf[i]*1.0)/pow(1+IRR,i); 10 return ans; 11 } 12 int main() 13 { 14 while(scanf("%d",&t) && t>0) 15 { 16 for(int i=0;i<=t;i++) scanf("%d",&cf[i]); 17 l=-1.0, r=1e8; 18 while(r-l>1e-4) 19 { 20 mid=(l+r)/2; 21 double tmp=calc(mid); 22 if(tmp>=0) l=mid; 23 else r=mid; 24 } 25 printf("%.2lf ",l); 26 } 27 }