此问题曾被问过,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 我得到正确的答案。 (我正在使用在线法官)。在我看来,按开始时间进行排序似乎也应该提供正确的输出,但我真的想不出一个示例。有人可以给我一个吗?
答案 0 :(得分:0)
这是例子
按开始排序时,红色间隔优先。这意味着,count
不会递增,直到存在一个start
大于10的间隔。因此,算法的输出将为1。但由于绿色和蓝色间隔不会,所以它的值为2。 t彼此重叠。
OTOH,如果算法按端点(as described in the answer to the linked question)排序,则绿色贡献点4,蓝色贡献点8,红色已经覆盖。得出正确答案2。