题解:CF858B Which floor?

upd:2025.2.12 - 修改了格式
这道题其实是道思维题,数据范围不大,@yuruilin2026 和@Hootime 一眼就秒了。
本题的难点在如何找每层楼的公寓数与 Polycarp 记得的公寓条件不矛盾的条件,但我们可以转换思路,寻找每层公寓数可取的范围,然后再带入求层数,判断最大值最小值算出来的数是否相等,若相等则说明有唯一解,否则输出 \(-1\)
那么现在题目就被转化为了如何找每层公寓数 \(x\) 的最大值和最小值,可得以下式子:
$\left \lceil \frac{x_i}{k_i} \right \rceil \le x\le \left \lfloor \frac{k_i-1}{(f_i)_{min}-1} \right \rfloor $

\(k_i\)同层最小的,则有:$x\le \frac{k_i-1}{f_i-1} $
\(k_i\)同层最大的,则有:\(\left \lceil \frac{k_i}{f_i} \right \rceil \le x\)
总层数为:$\left \lceil \frac{x}{n} \right \rceil $
核心代码

for(int i=1;i<=m;i++){
	int x=ceil(k[i]/f[i]),y;
	if(f[i]!=1) y=(k[i]-1)/(f[i]-1);
	if(ans_l<x) ans_l=x;
	if(ans_r>y) ans_r=y;
}
if(ceil(n/l)==ceil(n/r)) cout<<n/l+(n%l?1:0);
posted @ 2025-02-20 18:59  Kaori_Li  阅读(7)  评论(0)    收藏  举报
*/