璟雯院

珺璟如晔,雯华若锦

用户工具

站点工具


icpc:problems:usaco20jan_loan_repayment_s
problems
名称Loan Repayment S
题目编号USACO20JAN_S2
题目链接luogu.com.cn/…
来源USACO
算法分类二分, 数学
难易程度一般般

Loan Repayment S

想法

二分x,但是如果模拟天数则复杂度会为$O(KlogN)$,所以需要优化判断函数。由于操作中剩余奶量/X需要向下取整,故当X与N接近时,会出现Y很小,减去Y后,下一天取整后还是Y。说明会出现连续多天为一个奶量的情况,天数可以通过 $Q \% X / Y + 1$得出,$Q \% X $为余数,Y要变化,需要将余数减干净,商才会减少。故可以减少相同商的模拟来优化天数。

代码实现

#include<cstdio>
 
long long int n, k, m;
 
bool check(long long int x) {
	long long int days = 0, q = n, y;
	while(q > 0) {
		y = q / x;
		if(y <= m) {
			days += q / m + (q % m ? 1 : 0);
			return days <= k;
		}
		long long int repeat = q % x / y + 1;
		days += repeat;
		q -= repeat * y;
	}
	return days <= k && q < 0 ;
}
 
int main() {
	scanf("%lld %lld %lld", &n, &k, &m);
 
	long long int l = 1, r = n, mid;
	while(l < r) {
		mid = (l + r + 1) / 2;
		if(check(mid))
			l = mid;
		else
			r = mid - 1;
	}
	printf("%lld", l);
 
	return 0;
}
/app/www/public/data/pages/icpc/problems/usaco20jan_loan_repayment_s.txt · 最后更改: 2023/06/10 15:45 由 温婕莺