打卡信奥刷题(204)用C++工具信奥P1677[普及组/提高] [USACO18FEB] Hoofball B

[USACO18FEB] Hoofball B

题目描述

为了准备即将到来的蹄球锦标赛,Farmer John 正在训练他的 NNN 头奶牛(方便起见,编号为 1…N1\ldots N1N,其中 1≤N≤1001\le N\le 1001N100)进行传球。这些奶牛在牛棚一侧沿直线排列,第 iii 号奶牛位于距离牛棚 xix_ixi 的地方(1≤xi≤10001\le x_i\le 10001xi1000)。每头奶牛都在不同的位置上。

在训练开始的时候,Farmer John 会将若干个球传给不同的奶牛。当第 iii 号奶牛接到球时,无论是从 Farmer John 或是从另一头奶牛传来的,她会将球传给最近的奶牛(如果有多头奶牛与她距离相同,她会传给其中距左边最远的那头奶牛)。为了使所有奶牛都有机会练习到传球,Farmer John 想要确保每头奶牛都持球至少一次。帮助他求出为了达到这一目的他开始时至少要传出的球的数量。假设他在开始的时候能将球传给最适当的一组奶牛。

输入格式

输入的第一行包含 NNN。第二行包含 NNN 个用空格分隔的整数,其中第 iii 个整数为 xix_ixi

输出格式

输出 Farmer John 开始的时候最少需要传出的球的数量,使得所有奶牛至少持球一次。

样例 #1

样例输入 #1

5
7 1 3 11 4

样例输出 #1

2

提示

在上面的样例中,Farmer John 应该将球传给位于 x=1x=1x=1 的奶牛和位于 x=11x=11x=11 的奶牛。位于 x=1x=1x=1 的奶牛会将她的球传给位于 x=3x=3x=3 的奶牛,在此之后这个球会在位于 x=3x=3x=3 的奶牛和位于 x=4x=4x=4 的奶牛之间来回传递。位于 x=11x=11x=11 的奶牛会将她的球传给位于 x=7x=7x=7 的奶牛,然后球会被传给位于 x=4x=4x=4 的奶牛,在此之后这个球也会在位于 x=3x=3x=3 的奶牛和位于 x=4x=4x=4 的奶牛之间来回传递。这样的话,所有的奶牛都会至少一次接到球(可能从 Farmer John,也可能从另一头奶牛)。

可以看出,不存在这样一头奶牛,Farmer John 可以将球传给她之后所有奶牛最终都能被传到球。

C++实现

#include <bits/stdc++.h>
using namespace std;
int n, x[105], in[105], out[105];
int main()
{
cin >> n;
for(int i = 1; i <= n; i++) scanf(“%d”, &x[i]);
sort(x + 1, x + n + 1);
x[0] = -1e9, x[n + 1] = 1e9;
for(int i = 1; i <= n; i++)
{
if(x[i] - x[i - 1] <= x[i + 1] - x[i]) in[i - 1]++, out[i] = i - 1;
else in[i + 1]++, out[i] = i + 1;
}
int ans = 0;
for(int i = 1; i <= n; i++)
if(in[i] == 0) ans++;
for(int i = 1; i < n; i++)
if(in[i] == 1 && in[i + 1] == 1 && out[i] == i + 1 && out[i + 1] == i)
ans++;
cout << ans << endl;
return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP C++考级编程题实现、白名单赛事考题实现,感兴趣的请关注,我后续将继续分享相关内容

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值