洛谷题单指南-二分查找与二分答案-P1163 银行贷款
原题链接:https://www.luogu.com.cn/problem/P1163
题意解读:利率越小,贷款期限和每个月还的钱固定的情况下,越有可能能够还完全部的贷款,具备单调性,因此给定贷款利率、贷款月数、每月还款钱数,可以计算最终贷款还剩下多少,有两种情况:>=0,说明利率可能大了,要试探更小利率;<0,说明利率小了,要试探更大利率,对利率二分即可。
解题思路:
给定利率,如何计算终点贷款还剩下多少呢?
设已知全部贷款为W,每个月还w,一共还m个月,利率为x
第一月还剩:W * (1 + x) - w ( 说明:第一个产生的利息为W * x,还钱为w,所以剩下W + W * x - w = W * (1 + x)- w )
第二个月还剩:(W * (1 + x) - w)* (1 + x) - w (说明,即第一月剩下的贷款 * (1 + x) - w)
后面几个月的以此类推,每个月剩下的贷款都等于上个月剩下的贷款 * (1 + x) - w
得到最后一个月剩下的贷款,如果>=0,对利率x进行更小范围的试探,如果<0,对利率x进行更大范围的试探。
100分代码:
#include <bits/stdc++.h>
using namespace std;
double W, w, m;
double ans;
//x是月利率
bool check(double x)
{
double all = W;
for(int i = 1; i <= m; i++)
{
all = all * (1 + x) - w; //计算每个月还款后还剩多少贷款
}
return all >= 0; //如果最终剩余的贷款>=0,说明利息可能多了,还不完贷款,利率可以更小
}
int main()
{
cin >> W >> w >> m;
double l = 0, r = 10;
while(r - l > 1e-5) //结果有3位有效小数,所以用更多2个小数的1e-5来判段r、l接近相等
{
double mid = (l + r) / 2;
if(check(mid)) ans = mid, r = mid;
else l = mid;
}
cout << fixed << setprecision(1) << ans * 100;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?