解析:
剛開始自己寫的**:
我對l遞增排列,l相等按r遞增排列。
直接逐個判斷,相交,或者不相交。
但讓每乙個區間只和它前乙個區間發生關係,顯然是錯誤的。
比如:
[1,5]
[2,4]
[3,6]
答案應該是6,但是我這個**輸出的是7,原因是第三個區間[3,6]與[2,4]發生了關係,但是[1,5]已經把[2,4]覆蓋了。
#include//wawawawawawa!#include#include
#include
#include
#include
using
namespace
std;
typedef
long
long
ll;const
int maxn=1e5+20
;struct
node
st[maxn];
bool
cmp(node a , node b)
intmain()
ll sum=0
; sort(st+1,st+1+n,cmp);
sum=st[1].r-st[1].l+1
;
for(int i=2;i<=n;i++)
}cout
}
正確的貪心思路:
因為首要排序的是l,所以這個情況下r基本是亂序的。
下乙個區間需要算的前提是什麼?當然是超出之前所有區間的範圍了。
所以可以維護乙個最大r,只有當前的區間超越r,才能納入計算(其實自己算也是這個思想的,腦袋秀逗了)。
同時更新最大的r。
引以為戒~
ac**:
#include#include#include
#include
#include
#include
using
namespace
std;
typedef
long
long
ll;const
int maxn=1e5+20
;struct
node
st[maxn];
bool
cmp(node a , node b)
intmain()
ll sum=0
; sort(st+1,st+1+n,cmp);
sum=st[1].r-st[1].l+1
; ll r=st[1
].r;
for(int i=2;i<=n;i++)
else
if(st[i].r>r)
r=max(r,st[i].r);
}cout
}
洛谷P2082 區間覆蓋 加強版 (珂朵莉樹)
傳送門 雖然是黃題而且還是一波離散就能解決的東西 然而珂朵莉樹還是很好用 相當於一開始區間全為0,然後每一次區間賦值,問最後總權值 珂朵莉樹搞一搞就好了 1 minamoto 2 include 3 include4 include5 define ll long long 6 define it ...
1751 區間覆蓋問題
time limit 1000 ms memory limit 65536 kib problem description 設x1 x2 xn 是實直線上的n 個點。用固定長度的閉區間覆蓋這n 個點,至少需要多少個這樣的固定長度閉區間?對於給定的實直線上的n個點和閉區間的長度k,設計解此問題的有效演...
4 10區間覆蓋問題
問題描述 設x2,x2,xn是實直線上的n個點。用固定長度的閉區間覆蓋著n個點,至少需要多少個這樣的長度閉區間?設計解決此問題的有效演算法。演算法設計 對於給定的實直線上的n個點和閉區間的長度k,計算覆蓋點集的最少區間數。資料輸入 第一行有兩個整數n和k,表示有n個點,且固定長度閉區間的長度為k。接...