题目链接:link
题目大意:
在二维坐标系的第一象限上给你 n 个 ‘ 7 ’,问通过删除一些 ‘ 7 ’后最多可以看见多少个 ‘ 7 ’。
解题思路:
分别将每个 ‘ 7 ’的两个端点与原点相连,这两条直线与X轴形成角的弧度值可以视为一个区间,这样问题就转换成了给你n个区间,问最多有多少个区间不相交。
求区间不相交的个数: 对区间的右端点进行升序排序,然后从左往右贪心。
注意: 弧度用 long double 存储可以避免精度问题,atan2(a,b)表示 斜率为(a / b)的直线与X轴形成角的弧度值。
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
int main()
{
int n; cin >> n;
vector<pair<long double, long double>> p;
for (int i = 1; i <= n; i++)
{
long double x, y; cin >> x >> y;
long double a = atan2(y - 1, x), b = atan2(y, x - 1);
p.push_back({ b,a });
}
sort(p.begin(), p.end());
int ans = 1, k = 0;
for (int i = 1; i < n; i++)
{
if (p[i].second >= p[k].first)
{
ans++;
k = i;
}
}
cout << ans << endl;
return 0;
}