貪心演算法 區間覆蓋

2021-10-03 13:48:09 字數 1051 閱讀 9933

數軸上有 n (1<=n<=25000)個閉區間 [ai, bi],選擇盡量少的區間覆蓋一條指定線段 [1, t]( 1<=t<=1,000,000)。

覆蓋整點,即(1,2)+(3,4)可以覆蓋(1,4)。

不可能辦到輸出-1。

第一行:n和t

第二行至n+1行: 每一行乙個閉區間。

輸出選擇的區間的數目,不可能辦到輸出-1

input

3 10

1 73 6

6 10

output

2
首先,由於本題輸入資料量比較大,所以用cin.sync_with_stdio(false)讓cin達到和scanf相同的讀入效率(或者採用快讀)。

其次,本題的解決思路是貪心,每次選取最小的沒有被用過的區間,在能覆蓋ll(當前未覆蓋範圍的左邊界)的前提下使用右邊界最大的區間,直到覆蓋[1,t]。

這個題t了很多次,後來發現是while迴圈的條件邏輯不對導致無限迴圈,所以再次重複三遍,碼**的時候一定要思路清晰思路清晰思路清晰。

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

#define rep(i,s,t) for(int i=s;i<=t;i++)

#define mem(a,s) memset(a,s,sizeof(a))

struct xx[

25050];

bool

cmp(

const x&x,

const x&y)

intmain()

i--;ll=maxn;

if(ll>=t)

ll++

;i++;}

if(success) cout

}

C 區間覆蓋 貪心演算法

數軸上有 n個閉區間 ai,bi 選擇盡量少的區間覆蓋一條指定線段 1,t 不可能辦到輸出 1。定義乙個結構體代表區間,在讀入資料後,對資料進行多關鍵字排序 第一是左端點小的在前,第二是右端點大的在前 對資料進行過濾,左端點相同的區間只保留區間長度最大的,如果當前區間被之前保留的區間完全包含則去掉。...

貪心演算法 區間合併以及覆蓋問題

1.當前區間的左端點比最小組右端點小,說明兩區間有交集,就要開乙個新的組。2.當前區間的左端點比最小組右端點大,說明兩區間沒有交集,因此放入該組,並且將該組的右端點更新成加入區間的右端點。這裡將所有區間按左端點從小到大排序 sort range range n 這裡建立乙個小根堆,小根堆的最頂部是最...

區間排程 貪心演算法

一 找到數目盡可能多的相容任務 假設每個任務j從sj開始到fj結束。若要找到盡可能多的相容任務,只需要將所有任務按照結束時間排序,每次都選擇最早結束的那個任務。因為每次選最早結束的,則留給之後的時間就越多。在餘下的時間中與被選的那個任務衝突的任務最多也只能有乙個被選 代替現在被選的這個任務 但是留下...