洛谷P5119 Convent 题解

题目

很好想的一道二分题,首先,二分一定满足单调性,而题目中非常明显的就是用的车越多,所用时间越少,所以可以枚举时间,判断是否可以比\(m\)少。

然后在二分时,更是要注意下标的一些问题,也要注意车和\(m\)作比较的顺序。

\(Code\)

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
using namespace std;
int n, m, c;
int data[100100];
bool check(int a)
{
    int i = 1, pos = 1, ans = 0;
    while (i <= n)
    {
        if (i - pos + 1 > c || data[i] - data[pos] > a)
            ans++, pos = i; 
        i++;
        if (ans == m)
            return false;
    }
    if (ans == m)
        return false;
    return true;
}
int main()
{
    scanf("%d%d%d", &n, &m, &c);
    for (int i = 1; i <= n; i++)
        scanf("%d", &data[i]);  
    sort(data + 1, data + 1 + n);
    int l = 1, r = 1e9 + 1;
    int mid;
    while (l < r)
    {
        mid = (l + r) >> 1;
        if (check(mid))
            r = mid;
        else
            l = mid + 1;
    }
    printf("%d", l);
}

转载于:https://www.cnblogs.com/liuwenyao/p/10539493.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值