找到涵盖整个间隔集的最小点数

时间:2018-07-15 07:31:48

标签: algorithm sorting greedy

此问题曾被问过,Finding minimum number of points which covers entire set of intervals? 现在的答案是,间隔将根据结束时间进行排序。我的问题是,为什么按开始时间排序是错误的?这是我编写的代码-

   struct Interval {
   int start;
   int end;
   };
   bool helper(Interval a,Interval b)
   {
   return a.start<b.start;
   }
   int main() { 
     int t;
     cin>>t;
     while(t--)
     {
     int n,c;
     cin>>n>>c;
     vector<Interval> i(n);
     for(int j=0;j<n;j++)
     {
        cin>>i[j].start>>i[j].end;
     }

     sort(i.begin(),i.end(),helper);
     int count=1;
     Interval s=i[0];
     for(int j=1;j<n;j++)
     {
        if(i[j].start>s.end)
        {
            count++;
            s=i[j];
        }
     }
     cout<<count*c<<endl;
   }
   return 0;
}

如果我将助手功能更改为       返回a.end <= b.end 我得到正确的答案。 (我正在使用在线法官)。在我看来,按开始时间进行排序似乎也应该提供正确的输出,但我真的想不出一个示例。有人可以给我一个吗?

1 个答案:

答案 0 :(得分:0)

这是例子

enter image description here

按开始排序时,红色间隔优先。这意味着,count不会递增,直到存在一个start大于10的间隔。因此,算法的输出将为1。但由于绿色和蓝色间隔不会,所以它的值为2。 t彼此重叠。

OTOH,如果算法按端点(as described in the answer to the linked question)排序,则绿色贡献点4,蓝色贡献点8,红色已经覆盖。得出正确答案2。