问题描述:
解题思路:
官方:
总结:使用二分枚举符合条件的x,不能用贪心(又大到小依次枚举,会导致超时,因为数据太大(1e9以上,超过规定的1e8),因此需要使用二分减小时间复杂度。判断是否符合条件由官方思路所示。
注意点:1.枚举的数不能太小,因此使用二分时初始右边界为2e14。
2.传参问题:将参数放全局变量位置(函数外),可以实现全局使用,不要再函数内再定义。就不需要传参了
题解:
#include<bits/stdc++.h>
using namespace std;
using LL = long long;const int N = 200010;LL a[N];
int n, k;
int check(LL x) {LL res = 0;for (int i = 0; i < n; ++i) {res += min(a[i], x);}return res/x>=k; // 简短判断}
void solve()
{cin >> n >> k;for (int i = 0; i < n; ++i) cin >> a[i];LL l = 0, r = 2e14, mid = 0;while(l < r) // 这里使用到了二分模板,在后面附有相关知识点链接{mid = l + r + 1 >> 1; // 模板2:需要+1(根据此处代码判断使用那种模板)if(check(mid))l = mid; else r = mid - 1;}cout << r << '\n';
}
int main()
{ ios::sync_with_stdio,cin.tie(0), cout.tie(0);solve();return 0;
}
知识点:二分答案
二分答案模板:二分法模板_二分模板-CSDN博客