1. 蹄铁球

该篇文章介绍了一个问题,关于如何通过最少的初始传球次数让N只兔子在直线排列下都至少接球一次。通过计算相邻兔子之间的距离差和传球方向,确定了最少需要传出的球的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

为了准备即将到来的蹄球锦标赛,小刚正在训练他的N只兔子(方便起见,编号为1…N,其中1≤N≤100)进行传球。这些兔子在兔棚一侧沿直线排列,第i号兔子位于距离兔棚xi的地方(1≤xi≤1000)。每只兔子都在不同的位置上。在训练开始的时候,小刚会将若干个球传给不同的兔子。当第i号兔子接到球时,无论是从小刚或是从另一只兔子传来的,她会将球传给最近的兔子(如果有多只兔子与她距离相同,她会传给其中距左边最远的那只兔子)。

为了使所有兔子都有机会练习到传球,小刚想要确保每只兔子都持球至少一次。帮助他求出为了达到这一目的他开始时至少要传出的球的数量。

假设他在开始的时候能将球传给最适当的一组兔子。

输入格式

输入的第一行包含N。

第二行包含N个用空格分隔的整数,其中第i个整数为xi。

输出格式

输出小刚开始的时候最少需要传出的球的数量,使得所有兔子至少持球一次。

样例 #1

样例输入 #1

5
7 1 3 11 4

样例输出 #1

2

提示

在上面的样例中,小刚应该将球传给位于x=1的兔子和位于x=11的兔子。

位于x=1的兔子会将她的球传给位于x=3的兔子,在此之后这个球会在位于x=3的兔子和位于x=4的兔子之间来回传递。 位于x=11的兔子会将她的球传给位于x=7的兔子,然后球会被传给位于x=4的兔子,在此之后这个球也会在位于x=3的兔子和位于x=4的兔子之间来回传递。

这样的话,所有的兔子都会至少一次接到球(可能从小刚,也可能从另一只兔子)。

可以看出,不存在这样一只兔子,小刚可以将球传给她之后所有兔子最终都能被传到球。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e3 + 10;
const int MOD = 1e9 + 7;
int n, m, k, t;
ll a[MAXN];
ll b[MAXN];
ll to[MAXN];

int main()
{
    cin >> n;
    for (ll i = 1;i <= n;i++)
        cin >> a[i];
    sort(a+1, a+1+n);
    for (ll i = 1;i < n;i++)
        b[i] = a[i+1]-a[i];
    to[1] = 1;
    to[n] = -1;
    for (ll i = 2;i < n;i++)
    {
        if (b[i] >= b[i-1])
            to[i] = -1;
        else
            to[i] = 1;
    }
    int res = 0;
    for (ll i = 1;i < n;i++)
    {
        if (to[i] == 1 && to[i+1] == -1)
        {
            res++;
            if (to[i-1] == 1 && to[i+2] == -1)
                res++;
        }
    }
    cout<<res;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值