[JOI 2022 Final] 自学 题解
1.题意简述:
一个学期有
2.思路:
这道题想直接模拟非常麻烦,但是如果我们能够灵活运用二分算法,这道题就非常简单了。
考虑到数据范围较大,我们可以在
在
若上课效率更高,则分两种情况讨论:
-
1.可以在
节课内达到二分枚举的答案,则全部上课; -
2.不可以在
节课内达到目标,则将 个机会全部用上,再将剩下效率通过自习完成。
最后如果通过上述情况实现后仍无法达到目标,则返回
3.注意事项:
-
1.在判断是否达到目标时,我们不必统计课程效率,可以统计达到目标最少所需的课程数,这样统计似乎更加简单。。。
-
2.注意统计课程数时,因为需要用到除法的向上取整,而c++中的
函数精度问题比较大,所以推荐使用不带 类型的向上取整函数:
int calc (int x, int y) {
return x / y + (x % y != 0);
}
4.代码实现:
#include <bits/stdc++.h>
#define int long long
using namespace std;
#define N 300010
#define For(i,j,k) for(int i=j;i<=k;i++)
#define IOS ios::sync_with_stdio(),cin.tie(),cout.tie()
int n, m, a[N], b[N];
int calc (int x, int y) {
return x / y + (x % y != 0);
}
bool check (int mid) {
int day = 0;
For (i, 1, n) {
if (b[i] > a[i]) day += calc (mid, b[i]);
else if (a[i] * m >= mid) day += calc (mid, a[i]);
else day += m + calc (mid - a[i] * m, b[i]);
if (day > n * m) return false;
}
return true;
}
signed main () {
IOS;
cin >> n >> m;
For (i, 1, n) cin >> a[i];
For (i, 1, n) cin >> b[i];
int l = 0, r = LLONG_MAX;
while (l <= r) {
int mid = l + r >> 1;
if (check (mid)) {
l = mid + 1;
} else {
r = mid - 1;
}
}
cout << l - 1 << endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!