P1163 银行贷款-二分
摆烂了好久
总结一下模板这里是小数类型的二分
void Binary(double l, double r)
{
if (r - l < 1e-8)
{
ans = (r + l) / 2;
return;
}
if (check(mid)) Binary(l, mid);
else Binary(mid, r);
}
然后抄一下acwing的模板
//查找左边界 SearchLeft 简写SL
int SL(int l, int r)
{
while (l < r)
{
int mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
return l;
}
//查找右边界 SearchRight 简写SR
int SR(int l, int r)
{
while (l < r)
{
int mid = l + r + 1 >> 1; //需要+1 防止死循环
if (check(mid)) l = mid;
else r = mid - 1;
}
return r;
}
P1163 银行贷款
题目描述
当一个人从银行贷款后,在一段时间内他(她)将不得不每月偿还固定的分期付款。这个问题要求计算出贷款者向银行支付的利率。假设利率按月累计。
输入格式
三个用空格隔开的正整数。
第一个整数表示贷款的原值 $w_0$,第二个整数表示每月支付的分期付款金额 $w$,第三个整数表示分期付款还清贷款所需的总月数 $m$。
输出格式
一个实数,表示该贷款的月利率(用百分数表示),四舍五入精确到 $0.1%$。
数据保证答案不超过 $300.0%$。
输入输出样例 #1
输入 #1
1000 100 12
输出 #1
2.9
说明/提示
数据保证,$1 \leq w_0, w\leq 2^{31}-1$,$1 \leq m\leq 3000$。
我的思路:
x=当前未还款金额
ans=月利息
for(int i = 0; i < n; i ++ ){// 循环n月
cnt+=xans;// 每月产生的利息
x=x(1+ans) - w;
}
总还款金额=n*w
我的答案:
#include <iostream>
#include <cstdio>
using namespace std;
int n;
double last, w, ans, cnt;
void solve(double l, double r)
{
if (r - l < 1e-8)
{
ans = (l + r) / 2 * 100;
return;
}
double mid = (l + r) / 2, x = last;
for (int i = 0; i < n ; i ++ )
{
x = x * (1 + mid) - w;
}
if (x > 0) solve(l, mid);
else solve(mid, r);
}
int main()
{
cin >> last >> w >> n;
solve(0, 3);
printf("%.1f\n", ans);
return 0;
}