序列

序列(sequence.pas/c/cpp)

【題目描述】算法

    有一個整數序列,它的每一個數各不相同,咱們不知道它的長度是多少(即整數個數),但咱們知道在某些區間中至少有多少個整數,用區間(Li,Ri,Ci)來描述,表示這個整數序列中至少有Ci個數來自區間[Li,Ri],給出若干個這樣的區間,問這個整數序列的長度最少能爲多少?ide

【輸入文件】spa

    第一行一個整數N,表示區間個數;code

    接下來N行,每行三個整數(Li,Ri,Ci),描述一個區間。blog

【輸出文件】排序

    僅一個數,表示該整數序列的最小長度。input

【樣例輸入】it

    4event

    4 5 1class

    6 10 3

    7 10 3

    5 6 1

【樣例輸出】

    4

【數據規模】

N≤1000,0≤Li≤Ri≤l000,1≤Ci≤Ri-Li+1

 

 

考試時這題根本不會作。。模擬了一個只有10分的算法

1 題目的意思是選擇一些數,使得在[Li,Ri]中至少有C個數,目的是選儘可能少的數知足全部的區間要求。能夠將全部的區間按照右端點從小到大排序來考慮問題。對於當前的區間假設知足了它的要求,即這個區間中至少有Ci個數,那麼怎麼安排這些數的位置是無所謂的;又由於以後的區間都是右端點在當前這個區間右端點的右邊區間,故貪心地選當前區間靠後的若干個數。這樣不但能夠知足當前區間的要求,還能夠儘可能知足後面區間的要求,而且這種貪心的方法是最優的。
2 時間效率:
3     咱們要作的就是排序而且掃描,效率爲O(Nlog2N+∑(Ri-Li))(1<=i<=n)
4 空間效率:
5     O(N)
【題目分析與算法】
 1 program sequence;
 2 var
 3   n,i,same,ans:longint;
 4   a,b,c:array[1..1050] of longint;
 5 procedure sort(l,r:longint);
 6 var i,j,x,y,tmp:longint;
 7 begin
 8   i:=l;
 9   j:=r;
10   x:=a[(i+j) div 2];
11   y:=b[(i+j) div 2];
12   repeat
13    while ( a[i]<x ) or ( (a[i]=x) and (b[i]<y) ) do inc(i);
14    while ( a[j]>x ) or ( (a[j]=x) and (b[j]>y) ) do dec(j);
15    if i<=j then
16     begin
17       if (a[i]>a[j]) or ( (a[i]=a[j]) and (b[i]>b[j]) ) then
18        begin
19          tmp:=a[i]; a[i]:=a[j]; a[j]:=tmp;
20          tmp:=b[i]; b[i]:=b[j]; b[j]:=tmp;
21          tmp:=c[i]; c[i]:=c[j]; c[j]:=tmp;
22        end;
23       inc(i);
24       dec(j);
25     end;
26   until i>j;
27   if i<r then sort(i,r);
28   if l<j then sort(l,j);
29 end;
30 begin
31 assign(input,'sequence.in');
32 reset(input);
33 assign(output,'sequence.out');
34 rewrite(output);
35   readln(n);
36   for i:=1 to n do
37    readln(a[i],b[i],c[i]);
38   sort(1,n);            writeln;
39   //for i:=1 to n do
40    //writeln(a[i],' ',b[i],' ',c[i]);
41   ans:=0;
42   for i:=1 to n-1 do
43    begin
44      if b[i]<a[i+1] then
45       begin inc(ans,c[i]); c[i]:=0; end
46      else
47      if b[i]>=a[i+1] then
48       begin
49         same:=b[i]-a[i+1]+1;
50          if same>=c[i] then begin inc(ans,c[i]); dec(c[i+1],c[i]); c[i]:=0; end
51          else if same<c[i] then begin inc(ans,c[i]); c[i]:=0; dec(c[i+1],same); end;
52       end;
53    end;
54   if c[n]>0 then inc(ans,c[n]);
55   writeln(ans);
56 close(input);
57 close(output);
58    //for i:=1 to n do write(c[i],' ');
59 end.
錯誤的寫法
 1 program sequence;
 2 var
 3   n,i,ans:longint;
 4   l,r,c:array[1..1000] of longint;
 5   f:array[1..1000] of boolean;
 6 procedure init;
 7 var i:longint;
 8 begin
 9   readln(n);
10   for i:=1 to n do readln(l[i],r[i],c[i]);
11   fillchar(f,sizeof(f),false);
12 end;
13 procedure sort(left,right:longint);
14 var i,j,tmp,x,y:longint;
15 begin
16   i:=left;
17   j:=right;
18   x:=l[(i+j) div 2];
19   y:=r[(i+j) div 2];
20   repeat
21     while (r[i]<y) or ((r[i]=y)and(l[i]<x)) do inc(i);
22     while (r[j]>y) or ((r[j]=y)and(l[j]>x)) do dec(j);
23     if i<=j then
24      begin
25        if (r[i]>r[j]) or ((r[i]=r[j])and(l[i]>l[j])) then
26         begin
27           tmp:=r[i]; r[i]:=r[j]; r[j]:=tmp;
28           tmp:=l[i]; l[i]:=l[j]; l[j]:=tmp;
29           tmp:=c[i]; c[i]:=c[j]; c[j]:=tmp;
30         end;
31        inc(i);
32        dec(j);
33      end;
34   until i>j;
35   if i<right then sort(i,right);
36   if left<j then sort(left,j);
37 end;
38 procedure outit;
39 var i:longint;
40 begin
41   {writeln;
42   for i:=1 to n do writeln(l[i],' ',r[i],' ',c[i]);
43   writeln;
44   for i:=1 to 10 do write(f[i],'  ');   }
45   ans:=0;
46   for i:=1 to 1000 do
47    if f[i] then inc(ans);
48   writeln(ans);
49 end;
50 procedure doit;
51 var i,j:longint;
52 begin
53   for i:=1 to n do
54    begin
55      for j:=r[i] downto l[i] do
56       if f[j] then dec(c[i]);
57      if c[i]>0 then
58       for j:=r[i] downto l[i] do
59        begin
60          if not(f[j]) then begin f[j]:=true; dec(c[i]); end;
61          if c[i]=0 then break;
62        end;
63    end;
64       {if f[j] then
65        begin
66          dec(c[i]);
67          if c[i]=0 then break;
68        end
69       else
70        begin
71          f[j]:=true;
72          dec(c[i]);
73          if c[i]=0 then break;
74        end;}
75 end;
76 begin
77 assign(input,'sequence.in');
78 reset(input);
79 assign(output,'sequence.out');
80 rewrite(output);
81   init;
82   sort(1,n);
83   doit;
84   outit;
85 close(input);
86 close(output);
87 end.
個人正解
相關文章
相關標籤/搜索