银行贷款
题目描述
当一个人从银行贷款后,在一段时间内他(她)将不得不每月偿还固定的分期付款。这个问题要求计算出贷款者向银行支付的利率。假设利率按月累计。
输入格式
三个用空格隔开的正整数。
第一个整数表示贷款的原值 w 0 w_0 w0,第二个整数表示每月支付的分期付款金额 w w w,第三个整数表示分期付款还清贷款所需的总月数 m m m。
输出格式
一个实数,表示该贷款的月利率(用百分数表示),四舍五入精确到 0.1 % 0.1\% 0.1%。
数据保证答案不超过 300.0 % 300.0\% 300.0%。
样例 #1
样例输入 #1
1000 100 12
样例输出 #1
2.9
提示
数据保证, 1 ≤ w 0 , w ≤ 2 31 − 1 1 \leq w_0, w\leq 2^{31}-1 1≤w0,w≤231−1, 1 ≤ m ≤ 3000 1 \leq m\leq 3000 1≤m≤3000。
本题的关键点就是在m个月内能还清贷款
二分答案return的一定是个不等号
// Problem: P1163 银行贷款
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1163
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// Date: 2024-03-27 18:09:34
//
// Powered by CP Editor (https://cpeditor.org)
#include<bits/stdc++.h>
#define endl '\n'
#define int int64_t
#define ld long double
using namespace std;
int dx[] = { -1,0,1,0 };
int dy[] = { 0,1,0,-1 };
const int NC = 2e3 + 10;
char ches[NC][NC];
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
int a[N], b[N], n, m, k;
ld w0, w,eps = 1e-8;
bool check(ld rate) {
int cnt = 0;
ld bg = w0;
while (bg >= eps) {
bg = (bg + bg * rate) - w;
cnt++;
if (cnt > m)return false;
}
return cnt <= m;
}
void solve() {
cin >> w0 >> w >> m;
ld l = 0, r = 3,ans = 0;
while (r - l >= eps) {
ld mid = (l + r) / 2;
if (check(mid))ans = mid,l = mid;
else r = mid;
}
ans *= 100;
cout << fixed << setprecision(1) << ans << endl;
}
signed main() {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int t = 1;
//cin >> t;
while (t--) {
solve();
}
return 0;
}