洛谷春令营模拟赛TG1题解

洛谷春令营模拟赛TG1题解_第1张图片
题意概括:有\(n\)个互不重叠的区间,要求选取\(k\)个长度为\(t\)的不重叠区间,把这n个区间都覆盖住,求这个最小的\(k\)
(这种题一看就是贪心)我们考虑贪心。
不难想出如下的策略:
if (f % t + l[i] - r[i - 1] > t)
考虑之前的连续覆盖的长度,对\(t\)取余,加上这次的空隙区间,若大于t,则不完全覆盖区间的空隙。
很可惜这样的思路是错误的,为什么呢?
如果这一次区间空隙比较小,就像这样:洛谷春令营模拟赛TG1题解_第2张图片
就会出现错误。那么正确的贪心是怎么样的呢?
我们可以这样想。我们覆盖的区间那个\(t\)覆盖完之后就不管它吗?显然是不。我们可以在处理下一个区间的时候就考虑上一个区间的剩余部分是否余到了这里,如果余到了这里就从余的部分继续接就可以了。
【参考代码】

#include
using namespace std;
typedef long long LL;
int main(void)
{
    ios::sync_with_stdio(0);
    LL n,t;
    cin >> n >> t;
    LL last = 0,ans = 0;
    for(int i = 0 ; i < n ; i++)
    {
        LL l,r;
        cin>>l>>r;//输入区间
        if(r <= last)continue;//这里判断last是否多到了末尾,如果是就不用管这个区间了
        if(l < last) l = last;//这一句就是判断last(余的部分是否超过了这里。)
        LL p = LL(ceil(double(r-l)/t));
        ans += p;
        last = l + p * t;
    }
    cout<

LaTex

你可能感兴趣的:(洛谷春令营模拟赛TG1题解)