1 条题解
-
0
#include<stdio.h> #include<string.h> #include<math.h> using namespace std; #define exp 0.000001 double ans,dis[15],val; int n,power[15],end; double cal(double p) { double ret=0; for(int i=0;i<n;i++) ret+=dis[i]*pow(p,end-power[i]+1); return ret; } double bin(double L,double R) { if(R-L<exp) return L; double mid=(L+R)/2; double get=cal(mid); //printf("->%.5f %.5f %.5f\n",L,R,get); if(get>=val) return bin(L,mid); else return bin(mid,R); } int main() { int cas=1; while(scanf("%d",&n) && n!=-1) { for(int i=0;i<n;i++) scanf("%d%lf",&power[i],&dis[i]); scanf("%d%lf",&end,&val); if(cas>1) printf("\n"); printf("Case %d: %.05f\n",cas++,bin(1,2)-1); } return 0; }
- 数据读取与初始化:通过
scanf
函数读取投资次数n
,每次投资的月份power[i]
和金额dis[i]
,以及投资结束的月份end
和投资结束时的总价值val
。同时初始化测试用例编号cas
。 - 计算函数
cal
:定义cal
函数,该函数用于计算在给定利率p
的情况下,根据每次投资的金额dis[i]
和投资月份power[i]
,以及投资结束月份end
,计算出投资结束时的总价值。计算方式是对每次投资按照复利公式计算其在投资结束时的价值并累加。 - 二分查找函数
bin
:使用二分查找的方法来寻找满足投资结束时总价值为val
的利率p
。二分查找的区间初始为[1, 2]
,每次取区间中点mid
,通过cal
函数计算在该利率下的投资总价值get
。如果get
大于或等于val
,则在左半区间[L, mid]
继续查找;否则在右半区间[mid, R]
继续查找。当区间长度小于预先定义的精度值exp
时,认为找到了合适的利率,返回该利率值。 - 结果输出:对于每个测试用例,调用
bin
函数获取等效月利率,将其减 1(因为二分查找的初始区间是[1, 2]
,得到的利率是1 + 实际利率
的值),然后按照格式输出测试用例编号和该利率,每个测试用例的输出之间根据要求添加空行。
通过二分查找和复利计算,来确定使得投资在给定时间达到给定总价值的等效固定月利率。
- 数据读取与初始化:通过
- 1
信息
- ID
- 1200
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 4
- 已通过
- 1
- 上传者