题意:
在坐标轴上给定 n 条线段,有 k 个点,使这 n 条线段都至少有一个点在其上面(恰在端点也行)。
求 k 的最小值,并给出一个k最小时的方案。
数据范围:n<=1e3
解法:
将线段按右端点从小到大排序,
遍历,遇到未被标记的线段,贪心地在右端点插一个点,然后把这个点插到的线段标记。
复杂度O(n2)
code:
#include<bits/stdc++.h>
using namespace std;
const int maxm=1e3+5;
struct Node{
int l,r;
}a[maxm];
int mark[maxm];
int n;
bool cmp(Node a,Node b){
if(a.r!=b.r)return a.r<b.r;
return a.l<b.l;
}
signed main(){
ios::sync_with_stdio(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].l>>a[i].r;
if(a[i].l>a[i].r)swap(a[i].l,a[i].r);//数据可能l>r
}
sort(a+1,a+1+n,cmp);
vector<int>ans;
for(int i=1;i<=n;i++){
if(mark[i])continue;
int p=a[i].r;
ans.push_back(p);
for(int j=i+1;j<=n;j++){
if(a[j].l<=p&&a[j].r>=p){
mark[j]=1;
}
}
}
cout<<ans.size()<<endl;
for(auto i:ans){
cout<<i<<' ';
}
cout<<endl;
return 0;
}