您的位置:首页 > 其它

第六届省赛 E Internal Rate of Return(UVA 11881)二分求根

2014-10-03 14:40 375 查看
题意:

 

 + 

 +
... + 

 =
CF0

分析:这题有点坑,输出还说,如果不存在根输出NO,多个根输出“many Too many”通过限制条件分析,方程有且仅有一个实根,CF0>0,0<CFi<=10000 均为整数,而且结果精确到小数点后两位,看下图:



发现因为CF0为正整数,故CF0最小为1,可知IRR最大为10^4。

二分求方程根即可!

int a[12]={0},n;
double cal(double IRR)
{
double sum=a
;
for(int i=n;i>0;i--)
sum=sum/(1.0+IRR)+a[i-1];
return sum;
}
int main()
{
double cf0;
while(~scanf("%d",&n)&&n)
{
scanf("%lf",&cf0);
cf0=-cf0;
for(int i=1;i<=n;i++)scanf("%d",a+i);
double l=-1.0,r=10e4,mid;
for(int i=0;i<40;i++)
{
mid=(l+r)/2.0;
if(cal(mid)<cf0)r=mid;
else l=mid;
//if(r-l<eps)break;
}
printf("%.2f\n",mid);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: