列表

详情


NC24198. [USACO 2019 Jan S]Mountain View

描述

从农场里奶牛Bessie的牧草地向远端眺望,可以看到巍峨壮丽的山脉绵延在地平线上。山脉里由N座山峰(1≤N≤10^5)。如果我们把Bessie的视野想象成xy平面,那么每座山峰都是一个底边在x轴上的三角形。山峰的两腰均与底边成45度角,所以山峰的峰顶是一个直角。于是山峰i可以由它的峰顶坐标(xi,yi)精确描述。没有两座山峰有完全相同的峰顶坐标。

Bessie尝试数清所有的山峰,然而由于它们几乎是相同的颜色,所以如果一座山峰的峰顶在另一座山峰的三角形区域的边界上或是内部,她就无法看清。

请求出Bessie能够看见的不同的山峰的峰顶的数量,也就是山峰的数量。

输入描述

输入的第一行包含N。以下N行每行包含xi(0≤xi≤10^9)和yi(1≤yi≤10^9),描述一座山峰的峰顶的坐标。

输出描述

输出Bessie能够分辨出的山峰的数量。

示例1

输入:

3
4 6
7 2
2 5

输出:

2

说明:

在这个例子中,Bessie能够看见第一座和最后一座山峰。第二座山峰被第一座山峰掩盖了。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 87ms, 内存消耗: 1080K, 提交时间: 2020-09-07 20:10:45

#include<bits/stdc++.h>
using namespace std;
struct node{
	int l,r;
}m[100100];
int n,w,s,x,y;
int cmp(node a,node b){return a.l<b.l||(a.l==b.l&&a.r>b.r);}//排序方法
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)cin>>x>>y,m[i].l=x-y,m[i].r=x+y;//算出左右端点
	sort(m+1,m+n+1,cmp);
	for(int i=1;i<=n;i++)if(m[i].r>w)s++,w=m[i].r;//如果大于当前所有山的右端点,答案+1,更新最大右端点
	cout<<s;
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 145ms, 内存消耗: 2016K, 提交时间: 2020-09-06 15:58:11

#include<cstdio>
long long x[100003],y[100003],tot,n;
int main() {
	scanf("%d",&n);tot=n;
	for(int i=1;i<=n;i++) scanf("%lld%lld",&x[i],&y[i]);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)if(i!=j)
			if(y[j]+x[j]>=y[i]+x[i]&&x[j]-y[j]<=x[i]-y[i]){tot--;break;}
	printf("%d",tot);
	return 0;
}

上一题