首页 热点资讯 义务教育 高等教育 出国留学 考研考公
您的当前位置:首页正文

动态规划之灌溉草场

2024-12-15 来源:华佗小知识

问题描述

解题分析

程序实现

# include<iostream>
# include<cstring>
# include<queue>
using namespace std;

const int INFINITE = 1 << 31;
const int MAXL = 1000001;
const int MAXN = 10001;

int l, n, s, e, a, b;

struct id_f
{
    int id;
    int f;
    id_f(int ii, int ff)
    {
        id = ii;
        f = ff;
    }
};

bool operator < (const id_f idf1, const id_f idf2)//在优先级队列里,f值越小的越优先
{
    return idf1.f > idf2.f;
}

int main()
{
    cin >> n >> l;
    cin >> a >> b;
    a <<= 1;//a,b的定义变为覆盖的直径
    b <<= 1;
    int cowsHere[l + 1];
    memset(cowsHere, 0, sizeof(cowsHere));
    for(int i = 0; i < n; i++)
        {
            cin >> s >> e;
            while(s < e)
                {
                    s++;
                    cowsHere[s]++;
                }
            cowsHere[e]--;
        }
    int f[l + 1];
    memset(f, INFINITE, sizeof(f));
    priority_queue<id_f> pq;
    for(int i = a; i < b + 1; i += 2)
        {
            if(cowsHere[i] == 0)
                {
                    f[i] = 1;
                    if(i <= b + 2 - a)
                        pq.push(id_f(i, f[i]));
                }
        }
    for(int i = b + 2; i < l + 1; i += 2)
        {
            if(!pq.empty())
                {
                    id_f ele = pq.top();
                    while(ele.id < i - b)
                        {
                            pq.pop();
                            if(pq.empty())
                                break;
                            ele = pq.top();
                        }
                    if(!pq.empty() and cowsHere[i] == 0) f[i] = ele.f + 1;
                }
            if(f[i + 2 - a] != INFINITE)
                pq.push(id_f(i + 2 - a, f[i + 2 - a]));
        }
    if(f[l] != INFINITE) cout << f[l] << endl;
    else cout << -1 << endl;

    return 0;
}//时间复杂度:O(nlogn)

运行结果

显示全文