https://www.acwing.com/problem/content/114/
此题一开始争着想确实难写,可是你反过来想就简单多了,1->2,这就转换成了区间问题,使这些区间最小就行。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3+10;
const double eps=1e-6;
struct Segment{
double l,r;
}segment[N];
bool cmp(struct Segment a,struct Segment b)
{
return a.r<b.r;
}
int main()
{
int n,d; cin>>n>>d;
bool success=true;
for(int i=0;i<n;i++)
{
int x,y; cin>>x>>y;
if(y>d)
{
success=false;
break;
}
auto len=sqrt(d*d-y*y);
segment[i]={x-len,x+len};
}
if(!success) puts("-1");
else
{
sort(segment,segment+n,cmp);
int cnt=0;
double ed=-1e10;
for(int i=0;i<n;i++)
{
if(ed<segment[i].l+eps)
{
cnt++;
ed=segment[i].r;
}
}
cout<<cnt<<endl;
}
return 0;
}
一开始是pair写的,默认以左端点大小排序,可是没AC,我对此画出图4做出解释,以左端点排序的话会看r1,r2,r3取不到r4(r4左端点最小),若是以右端点排序的话,那么r4这个区间就能满足所有.这是有高度不同导致区间长度不同导致的。