题目地址:线段覆盖
贪心题,首先将线段端点调整为左端点小于(或等于)右端点;第二,根据右端点将线段从小到大排序;第三,扫描一遍,每次遇到的第一个与当前的max不想交的即为最优选择。
同时写了俩解法,一个用二维数组,一个用容器,就当练习vector了。。。
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#define prag1
#ifdef prag1
using namespace std;
struct data{
int a;
int b;
};
bool cmp(const data &a,const data &b)
{
return a.a<b.a;
}
int main()
{
vector<data>line;
data temp;
int n;
cin>>n;
while(n--)
{
cin>>temp.a>>temp.b;
if(temp.a>temp.b)
swap(temp.a,temp.b);
line.push_back(temp);
}
sort(line.begin(),line.end(),cmp);
vector<data>::iterator it;
/*
for(it=line.begin();it!=line.end();it++)
{
cout<<(*it).a<<" "<<(*it).b<<endl;
}
*/
int ans=1;
int now=(*line.begin()).b;
for(it=line.begin()+1;it!=line.end();it++)
{
if((*it).a>=now)
{
ans++;
now=(*it).b;
}
else
{
if((*it).b<now)
now=(*it).b;
}
}
cout<<ans<<endl;
return 0;
}
#endif // prag1
#ifndef prag1
using namespace std;
int cmp(const void *x,const void *y)
{
int *a = (int*)x,*b = (int*)y;
if(a[0]==b[0]) return a[1]-b[1];
return a[0]-b[0];
}
int main()
{
int n,ave=0,a[110][2];
cin>>n;
for(int i=0; i<n; i++)
{
int l,r;
cin>>l>>r;
if(l<r)
{
a[i][0] = l;
a[i][1] = r;
}
else
{
a[i][0] = r;
a[i][1] = l;
}
}
qsort(a,n,sizeof(int)*2,cmp);
for(int i=0; i<n; i++)
{
cout<<a[i][0]<<" "<<a[i][1]<<endl;
}
int ans = 1,now = a[0][1];
for(int i=1; i<n; i++)
{
if(a[i][0]>=now)
{
ans++;
now = a[i][1];
}
else
{
if(a[i][1]<now) now = a[i][1];
}
}
cout<<ans<<endl;
}
#endif // prag1
/*
3
6 3
1 3
2 5
*/