在二维坐标系的第一象限上给你 n 个 ‘ 7 ’,问通过删除一些 ‘ 7 ’后最多可以看见多少个 ‘ 7 ’。
解题思路:分别将每个 ‘ 7 ’的两个端点与原点相连,这两条直线与X轴形成角的弧度值可以视为一个区间,这样问题就转换成了给你n个区间,问最多有多少个区间不相交。
求区间不相交的个数: 对区间的右端点进行升序排序,然后从左往右贪心。
注意: 弧度用 long double 存储可以避免精度问题,atan2(a,b)表示 斜率为(a / b)的直线与X轴形成角的弧度值。
#includeusing namespace std; typedef long long ll; typedef pair PII; int main() { int n; cin >> n; vector > 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; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)