原题链接:https://www.dotcpp.com/oj/submit_status.php?sid=12243918
马上就要进行第十四届蓝桥杯国赛了,自从打完省赛后就没有怎么刷过题了,这两天想了想,感觉还是得多刷点题,争取在这次国赛中拿个三等奖。
题目描述:
这是一道二分的算法题,我第一次写这道题的时候并没有通过所有测试用例,起初我把n,m等变量改成longlong类型,但还是不行,后来发现这是因为二分的时候控制边界等问题,我总是会把这里写错,后来我又看了下以前写的二分模板题:
二分 :数的范围_夏微凉(●'◡'●)的博客-CSDN博客
我又重新写了下,于是就能通过了。
AC后的感觉是真的好爽 😊
把我的代码给献上:
#include<iostream> using namespace std; long long int n, m; long long int a[200010], b[200010]; bool check(int k) { long long int count = 0; for (int i = 0; i < n; i++) { if (a[i] < k) { if (k - a[i] > b[i]) { return false; } count += k - a[i]; } } if (count > m) { return false; } else { return true; } } int main() { cin >> n >> m; for (int i = 0; i < n; i++) { cin >> a[i]; } for (int i = 0; i < n; i++) { cin >> b[i]; } long long int left = 0, right = 20000000; while (left<right) { long long int mid = (left + right +1) / 2; if (check(mid) == true) { left = mid; } else { right = mid - 1; } } cout << right<< endl; return 0; }