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;
}
posted @ 2025-07-30 13:42  Roin_Long  阅读(6)  评论(0)    收藏  举报