USACO 2014 JAN 滑雪录像

2. 滑雪录像{silver3}

【问题描述】

   冬奥会的电视时刻表包含N (1 <= N <= 150)个节目,每个节目都有开始和结束时间。农民约翰有两台录像机,请计算他最多可以录制多少个节目。

【文件输入】

第一行,一个整数N。

接下来N行每行两个整数,表示一个节目的开始和结束时间,范围为0..1,000,000,000。

【文件输出】

一个整数,表示最多可以录制的节目数量。

【输入样例】

6

0 3

6 7

3 10

1 5

2 8

1 9

【输出样例】

4

【样例说明】

第1台录制节目1和3,第2台录制节目2和4。

首先感谢 宝宝的思路分享~

思路:

贪心,因为是两个相机,所以如果用动归的话,就会出现重复使用,方大神动归只有70,因为特判比较复杂,本渣就放弃了。

开始写了暴搜,可是同样因为重叠的原因,只有10分,所以还是贪心。

贪心的思路就是,首先按照结束时间b[i]进行排序,(为什么不用开始时间呢,因为如果按照开始时间排序,会出现开始时间很小,但是时间段很长的情况,这样的话,就会影响最优)。 然后设两个变量来记录两个相机当前节目的结束时间,然后从1到n个节目进行比较,可加入就加入。

PS:当两个相机都可以加入的时候,应选取结束时间靠后的相机加入。原因:因为是按照结束时间排序,有可能会出现后来的节目开始时间比此节目靠前,此时可将其加入到之前结束时间靠前的相机中。

举例说明:

|------|  结尾时间4

|----------|  结尾时间6

比如上面为两个相机已加入的时间段, 现在再加入一条开始时间为9的,则应加入到第二个,因为如果下一个节目开始时间为5,则又可以加入到第一个,若将9的加入到第一个, 则5的就无法加入,就无法最优。

program recording;
var i,j,k,n,m,x,y:longint;
a,b:array[0..100001] of longint;

procedure data1;
var i,j:longint;
 begin
  assign(input,'recording.in');
  assign(output,'recording.out');
  reset(input);
  rewrite(output);
 end;

procedure data2;
 begin
  close(input);
  close(output);
 end;


    procedure sort(l,r: longint);
      var
         i,j,x,y: longint;
      begin
         i:=l;
         j:=r;
         x:=b[(l+r) div 2];
         repeat
           while b[i]
            inc(i);
           while x
            dec(j);
           if not(i>j) then
             begin
                y:=b[i];
                b[i]:=b[j];
                b[j]:=y;
                y:=a[i];
                a[i]:=a[j];
                a[j]:=y;
                inc(i);
                j:=j-1;
             end;
         until i>j;
         if l
           sort(l,j);
         if i
           sort(i,r);
      end;

procedure datain;
var i,j,x,y,ans:longint;
 begin
  readln(n);
  for i:=1 to n do
   readln(a[i],b[i]);
  sort(1,n);
  x:=0;y:=0;ans:=0;
  for i:=1 to n do
   begin
    if (a[i]>=x) and (a[i]>=y) then
      if x>y then begin inc(ans);x:=b[i]; continue; end
      else begin inc(ans);y:=b[i]; continue; end;
    if a[i]>=x then begin inc(ans);x:=b[i]; end;
    if a[i]>=y then begin inc(ans);y:=b[i]; end;
   end;
  writeln(ans);
 end;

begin
 data1;
 datain;
 data2;
end.
原文地址:https://www.cnblogs.com/ddky00/p/4074328.html