cf 2004A Closest Point

题目:

考虑直线上的一组点。两点 ii 和 jj 之间的距离是 |i−j||i−j| 。

如果集合中没有其他点 kk ,使得 jj 到 kk 的距离严格小于 jj 到 ii 的距离,那么集合中的点 ii 是最接近集合中的点 jj 的。换句话说,集合中所有其他点到 jj 的距离都大于或等于 |i−j||i−j| 。

例如,考虑一组点 {1,3,5,8}{1,3,5,8} :

  • 对于点 1,最近的点是 3 (其他点的距离大于 3 )。(其他点的距离大于 |1−3|=2|1−3|=2 );
  • 对于点 3 ,有两个最近点: 1 和 5 ;
  • 对于点 5 ,最近的点是 3 (但不是 8 ,因为它的距离大于 |3−5||3−5| );
  • 对于点 8 ,最近的点是 5 。

给你一组点。你必须在这个集合中加入一个整数的点,使它与集合中现有的每一个点不同,并且它成为与集合中每一个点**最近的点。这可能吗?

思路:

只有n==1 和  n == 2 的情况下,才能找到最近的点,如果n >= 3 ,那么三个点集合找不到插入一个整数,使得整数离每个点最近,故而判断条件中有n > 3 ,

当集合为连续的两个数字,例如,5, 6,那么,距离二者最近的点应该是5.5,题目要求整数,故而集合中两个数字不应该是连续的

代码:

#include<iostream>
using namespace std;
const int N = 45;
int n;
int a[N];

void solve() {
	cin >> n;
	for(int i = 0; i < n; i++) cin >> a[i];
	if (n < 3 && a[1] - a[0] > 1) {
		puts("YES");
		return;
	} 
	puts("NO");
}  
int main() {
	int t;
	cin >> t;
	while(t--) {
		solve();
	}
	return 0;
} 

cf现在有点崩,等我重交一下看代码对不对,思路是这样的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值