題目:
有乙個序列,題目用n 個整數組合[ai,bi,ci]來描述它,[ai,bi,
ci]表示在該序列中處於[ai,bi]這個區間的整數至少有ci 個。如果存在這樣的序列,請求
出滿足題目要求的最短的序列長度是多少。如果不存在則輸出-1。
輸入:第一行包括乙個整數n,表示區間個數,以下n 行每行描述這些區間,第i+1 行
三個整數ai,bi,ci,由空格隔開,其中0<=ai<=bi<=50000 而且1<=ci<=bi-ai+1。
輸出:一行,輸出滿足要求的序列的長度的最小值。
輸入樣例:
537 3
8 10 3
6 8 1
1 3 1
10 11 1
輸出樣例:
6分析:
線性函式,其實是可以轉化為單源最短路徑問題,從而用剛才所準備到的bellman ford演算法
來解決它。
**:const
maxn=150000;
type
node=record
fromv,endv,value:longint;
end;
vardata:array[0..maxn] of longint;
elist:array[0..maxn] of node;
n,m,max,min:longint;
procedure add(x,y,z:longint);
begin
inc(m);
with elist[m] do
begin
fromv:=x;
endv:=y;
value:=z;
end;
end;
procedure init;
vari,x,y,z:longint;
begin
readln(n);
m:=0;max:=0;min:=maxlongint;
for i:=1 to n do
begin
readln(x,y,z);
dec(x);
add(y,x,-z);
if maxx then
min:=x;
end;
for i:=min+1 to max do
begin
add(i-1,i,1);
add(i,i-1,0);
end;
end;
procedure main;
vari:longint;
check:boolean;
begin
for i:=min to max do
data[i]:=100000;
while true do
begin
check:=true;
for i:=1 to m do
with elist[i] do
if data[endv]>data[fromv]+value then
begin
data[endv]:=data[fromv]+value;
check:=false;
end;
if check then
break;
end;
writeln(data[max]-data[min]);
end;
begin
init;
main;
end.
差分約束 poj 1201 Interval
差分約束 poj 1201 又是一道vector tle。確實很好的差分約束。很好的差分約束,注意隱含條件 0 d i 1 d i 1 題目保證了沒負圈。include include include using namespace std define n 50005 define inf 100...
POJ 1201 樹狀陣列
給你n個區間,每個區間為 a,b 每個區間取c個數構成乙個集合,求集合最小容量 把區間按b排序,從第乙個區間開始取,從後往前取,這樣盡可能和後面的區間重複 另外如果我們發現當前區間取得個數已經超過了c,那麼只需要讓之前區間換就行,而總數是不變的,所以不用更新答案 求當前區間已經取了多少個數用樹狀陣列...
poj 1201 差分約束
傳送門 題意 ai到bi間至少有ci個元素,問所有數中至少有多少元素。額。這樣好像說不清楚,我拿樣例說下吧。3到7之間至少有3個元素,8到10之間至少有3個元素,6到8之間至少有1個元素,1到3之間至少有1個元素,10到11之間至少有1個元素。最少情況如下 1 2 3 4 5 6 7 8 9 10 ...