題目描述 description
數軸上有n條線段,線段的兩端都是整數座標,座標範圍在0~1000000,每條線段有乙個價值,請從n條線段中挑出若干條線段,使得這些線段兩兩不覆蓋(端點可以重合)且線段價值之和最大。
輸入描述 input description
第一行乙個整數n,表示有多少條線段。
接下來n行每行三個整數, ai bi ci,分別代表第i條線段的左端點ai,右端點bi(保證左端點《右端點)和價值ci。
輸出描述 output description
輸出能夠獲得的最大價值
樣例輸入 sample input
1 2 1
2 3 2
1 3 4
樣例輸出 sample output
資料範圍及提示 data size & hint
n <= 1000000
0<=ai,bi<=1000000
0<=ci<=1000000
資料輸出建議使用long long型別(pascal為int64或者qword型別)
/*終於明白為什麼用右端點排序了,因為這樣排序可以保證i能接上的點一定在i的前面,就可以
找i之間的點的最大值,樸素的找法是o(n^2)的,可以考慮用二分,因為右端點具有單調性,
但是f陣列不具有單調性,所以可以考慮設g[i]=max(f[j](j*/
#include
#include
#include
#define n 1000010
#define ll long long
using
namespace
std;
ll n,f[n],ans;
struct
node
;node e[n];
ll read()
while(c>='
0'&&c<='9')
return num*flag;
}bool cmp(const node&s1,const node&s2)
ll erfen(ll l,ll r,ll x)
if(e[l].y<=x)return
l;
return l-1;}
intmain()
cout
}
CODEVS 3012 線段覆蓋 4
題意 每個線段有左端點,右端點和積分,找出互不覆蓋的線段的積分和的最大值。和線段覆蓋2唯一的區別就在於資料範圍變大了,至於它的空間限制縮小對用dp做這個題並沒有什麼影響。先說下線段覆蓋2的做法 按左右端點排序都可以 線段覆蓋4需要按右端點排序,這裡按右端點從小到大排序來講 第一層迴圈從左到右列舉每個...
Codevs 3012 線段覆蓋 4
3012 線段覆蓋 4 時間限制 1 s 空間限制 64000 kb 題目等級 gold 題目描述 description 數軸上有n條線段,線段的兩端都是整數座標,座標範圍在0 1000000,每條線段有乙個價值,請從n條線段中挑出若干條線段,使得這些線段兩兩不覆蓋 端點可以重合 且線段價值之和最...
codevs3012 線段覆蓋4
這個題很好想到它的無後效性,但是我並不是很會寫轉移方程,看了別人的題解以後豁然開朗,序列dp多是以序列的第幾位作為狀態來進行轉移的 include include include using namespace std intn long long ans 1000010 ans i 表示i以前所有...