UVA 11881

依然是来自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 }
原文地址:https://www.cnblogs.com/dilthey/p/7545738.html