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;
}
posted @ 2023-03-23 19:26  Kevin_Chance  阅读(82)  评论(0)    收藏  举报