uses math;
var a,b,F:array[0..10000]oflongint;
i,n,j,kq:longint;
Procedure sort(L,H:longint);
Var i,j:longint;
x,tg:longint;
Begin
i:=L;
j:=H;
x:=a[(L+H)div2];
RepeatWhile(a[i]<x)do inc(i);
While(a[j]>x)do dec(j);
If i<=j thenBegin
tg:=a[i];
a[i]:=a[j];
a[j]:=tg;
tg:=b[i];
b[i]:=b[j];
b[j]:=tg;
inc(i);
dec(j);
End;
Until i>j;
If L<j then sort(L,j);
If i<H then sort(i,H);
End;
BEGINreadln(n);
for i:=1to n doread(a[i],b[i]);
sort(1,n);
for i:=1to n do f[i]:=b[i]-a[i];
for i:=1to n dofor j:=i-1downto1doif a[i]>=b[j]then f[i]:=max(f[i],f[j]+b[i]-a[i]);
for i:=1to n do kq:=max(kq,f[i]);
write(kq);
END.
Trả lời: Các anh chị ơi giúp em với :(( 8 năm trước
(+1)
Bài này O(n.logn) hoặc là O(30000 + n) thôi. Không thể n^2 mà AC được đâu.
Mình làm bài này như thế này:
Code:
- Với mỗi thời điểm kết thúc t ta lưu lại các thời điểm bắt đầu s tương ứng. Như vậy với mỗi t có thể có nhiều s => Lưu lại bằng danh sách liên kết.
Sau đó ta quy hoạch động như sau:
Code:
- Gọi F[t] là tổng thời gian lớn nhất hội trường được sử dụng với thời điểm kết thúc các buổi họp phải <= t.
- F[0] := 0;
- F[t] := max(F[t - 1], F[s] + t - s);
(t = 1 -> 30000; s là các thời điểm bắt đầu tương ứng với t).
Trả lời: Các anh chị ơi giúp em với :(( 8 năm trước
(+0)
blazedragon viết:
QUOTE: Bài này O(n.logn) hoặc là O(30000 + n) thôi. Không thể n^2 mà AC được đâu.
Mình làm bài này như thế này:
Code:
- Với mỗi thời điểm kết thúc t ta lưu lại các thời điểm bắt đầu s tương ứng. Như vậy với mỗi t có thể có nhiều s => Lưu lại bằng danh sách liên kết.
Sau đó ta quy hoạch động như sau:
Code:
- Gọi F[t] là tổng thời gian lớn nhất hội trường được sử dụng với thời điểm kết thúc các buổi họp phải <= t.
- F[0] := 0;
- F[t] := max(F[t - 1], F[s] + t - s)(t = 1 -> 30000; s là các thời điểm bắt đầu tương ứng với t).