这道题一读就是经典的区间问题,是区间覆盖,敲过之后还有花了很长的调试时间,还是我不熟练,现在做题确实挺慢
的,简单题目也要做好久,没事,慢慢来。最重要的要确保正确率和心态问题,认真对待,调试找到了好多bug,一些
细节问题。。。都是刚开始没有注意到的。交了之后RE,在数组上多加了两个0。A了,,uva老是不提示数据有多大,
所以只能乱开。。。
思路:
先对区间按左边的点进行排序,如果当前需要涵盖的区间为[x,y],那么在排序的区间中到左边小于x,右
边最大的那个区间,设为Max,然后更新想找的区间为[Max,m],依次类推,知道没有小于x的区间或者最大值已经大
于了m。。
贴代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
struct node
{
int x,y;
}a[500005],b[500005];
int cmp(const void *a,const void *b)
{
if(((node *)a)->x == ((node *)b)->x)
return ((node *)b)->y - ((node *)b)->y;
return ((node *)a)->x - ((node *)b)->x;
}
int main()
{
int T,i,m,x,y;
cin >> T;
while(T--)
{
cin >> m;
i = 1;
while(cin >> x >> y,x||y)
{
a[i].x = x;
a[i].y = y;
i++;
}
int s = i-1;
qsort(a+1,s,sizeof(a[0]),cmp);
// for(i=1; i<=s; i++)
// cout << a[i].x << " " << a[i].y << endl;
int cnt = 0;
int flag = 0;
int k=1;
int flag1 = 0;
int Max = 0;
int Max1;
for(i=1; i<=s; i++)
{
if(a[i].x <= cnt)
{
if(Max <= a[i].y)
{
Max = a[i].y;
Max1 = a[i].x;
}
flag = 1;
if(i!=s)
continue;
}
if(i != s)
i--;
// cout << " i= " << i << endl;
if(flag == 0)
{
break;
}
b[k].x = Max1;
b[k].y = Max;
//cout << a[i].x << a[i].y << endl;
k++;
cnt = Max;
flag = 0;
if(cnt >= m)
{
flag1 = 1;
break;
}
}
if(flag1)
{
cout << k-1 << endl;
for(i=1; i<k; i++)
{
cout << b[i].x << " " << b[i].y <<endl;
}
}
else
{
cout << '0' << endl;
}
if(T)
cout << endl;
}
return 0;
}