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 由 温婕莺