CSP202303_2
CSP202303_2
题目
思路
通过总计为 m 的资源来缩短每个土地的时间,最直观的思路就是通过从小到大枚举答案,判断其是否能在使用不超过 m 份资源的情况下满足要求。\(k \leq t_{min}\),实际枚举可能需要枚举到土地耗时的最大值,而 \(t 、n\) 本身都是是 1e5 的范围, 因此时间复杂度为\(O(nt)\),应该无法通过全部测试点。
考虑到题目的答案显然满足单调性。若较小的 k 可以在 m 份资源内满足,更大的一定都可以满足。因此直接二分答案,下界为 k,上界为所有土地基本耗时中的最大值。check函数直接模拟使用资源的过程,若能满足当前的要求时间,记录答案并更新二分右边界,尝试寻找更小的答案,否则更新左边界。时间复杂度\(O(nlogt)\)。
思路相对简单,在学习过二分后考场一遍切掉这道题还是比较容易的。同考场的同学也有没采用二分纯暴力 AC 的,时间限制实际应该也比较宽松,
Code
#include<bits/stdc++.h>
using namespace std;
int n, m, k;
int ans;
int MAX = -1;
int t[100010];
int c[100010];
bool check(int x)
{
int sum = 0;
for(int i = 1;i <= n;i++)
{
if(t[i] <= x)
continue;
sum += c[i]*(t[i] - x);
if(sum > m) return false;
}
return true;
}
int main()
{
cin >> n >> m >> k;
for(int i = 1;i <= n;i++)
{
cin >> t[i] >> c[i];
MAX = max(MAX, t[i]);
}
int l = k, r = MAX;
while(l <= r)
{
int mid = (l + r) >> 1;
if(check(mid))
{
ans = mid;
r = mid - 1;
}
else
{
l = mid + 1;
}
}
cout << ans << endl;
return 0;
}

浙公网安备 33010602011771号