1、首先,我们需要明白题目的意思,这是一个数学问题。
根据题意:我们可以得到以下的式子:
(w0:贷款原值;w:每月分期还款;m: 还完款的总月数;ans:月利率(小数))
2、其次,考虑单调性。
二分的关键就是要保证数据有单调性!
观察这个式子:我们不难发现,如果将ans看成自变量,随着ans的增大,等式左边的值会变小。
3、再次,考虑枚举对象和枚举范围。
既然题目求的是月利率(ans),那么我们可以枚举ans;
枚举范围从0到5即可(因为题干中明确月利率最大为3,要尽量确保枚举的范围大于实际能取到的范围)
4、然后,确定check函数(这是二分的核心!)
我们假设等式左边为res。
最后,话不多说,上代码
#include <bits/stdc++.h>
using namespace std;
double w0,w,m;
int check (double x)
{
double res=0;
for (int i=1;i<=m;i++)//求等式的左值
{
res+=w/pow (1.0+x,i);
}
if (res>=w0)//判断l指针满足的条件
return true ;
else
return false ;
}
int main ()
{
cin>>w0>>w>>m;
double l=0.0,r=5.0;//二分标准的模板:r l可以看成两个指针。
while (r-l>=1e-4)//浮点数二分,一定要注意范围(精确度)
{ //题目中ans是小数。
double mid=(l+r)/2;
if (check(mid))//核心的check函数
l=mid;//如果满足check函数,将l(左指针)移到该位置。
else
r=mid;//否则,将r(右指针)移到该位置。
}
printf ("%.1lf",l*100);//答案在l处,输出l即可,
//一定要注意*100,因为测试样例的答案是*100以后的结果。否则会输出0.0
return 0;
}
希望大家喜欢这篇题解,作为一个小白,如果有不足的地方,欢迎大家指正!