AcWing 1738. 蹄球

题目描述

为了准备即将到来的蹄球锦标赛,Farmer John 正在训练他的 N 头奶牛(方便起见,编号为 1…N

)进行传球。

这些奶牛在牛棚一侧沿直线排列,第 i
号奶牛位于距离牛棚 xi

的地方。

每头奶牛都在不同的位置上。

在训练开始的时候,Farmer John 会将若干个球传给不同的奶牛。

当第 i

号奶牛接到球时,无论是从 Farmer John 或是从另一头奶牛传来的,她会将球传给最近的奶牛(如果有多头奶牛与她距离相同,她会将球传给这些奶牛中最左边的那头奶牛。)。

为了使所有奶牛都有机会练习到传球,Farmer John 想要确保每头奶牛都持球至少一次。

帮助他求出为了达到这一目的他开始时至少要传出的球的数量。

假设他在开始的时候能将球传给最适当的一组奶牛。
输入格式

输入的第一行包含 N

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


输出格式

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

1≤N≤100
,
1≤xi≤1000

输入样例:

5
7 1 3 11 4

输出样例:

2

样例解释

在上面的样例中,Farmer John 应该将球传给位于 x=1
的奶牛和位于 x=11

的奶牛。

位于 x=1
的奶牛会将她的球传给位于 x=3 的奶牛,在此之后这个球会在位于 x=3 的奶牛和位于 x=4

的奶牛之间来回传递。

位于 x=11
的奶牛会将她的球传给位于 x=7 的奶牛,然后球会被传给位于 x=4 的奶牛,在此之后这个球也会在位于 x=3 的奶牛和位于 x=4

的奶牛之间来回传递。

这样的话,所有的奶牛都会至少一次接到球(可能从 Farmer John,也可能从另一头奶牛)。

可以看出,不存在这样一头奶牛,Farmer John 可以将球传给她之后所有奶牛最终都能被传到球。
难度: 简单
时/空限制: 1s / 64MB
总通过数: 1078
总尝试数: 2632
来源: USACO 2018 February Contest Bronze
算法标签

样例

输入样例:

5
7 1 3 11 4

输出样例:

2

样例解释

在上面的样例中,Farmer John 应该将球传给位于 x=1
的奶牛和位于 x=11

的奶牛。

位于 x=1
的奶牛会将她的球传给位于 x=3 的奶牛,在此之后这个球会在位于 x=3 的奶牛和位于 x=4

的奶牛之间来回传递。

位于 x=11
的奶牛会将她的球传给位于 x=7 的奶牛,然后球会被传给位于 x=4 的奶牛,在此之后这个球也会在位于 x=3 的奶牛和位于 x=4

的奶牛之间来回传递。

这样的话,所有的奶牛都会至少一次接到球(可能从 Farmer John,也可能从另一头奶牛)。

可以看出,不存在这样一头奶牛,Farmer John 可以将球传给她之后所有奶牛最终都能被传到球。
难度: 简单
时/空限制: 1s / 64MB
总通过数: 1078
总尝试数: 2632
来源: USACO 2018 February Contest Bronze
算法标签


算法

深搜

C++ 代码

#include<bits/stdc++.h>
using namespace std;
int a[105];
int dis[105][5];
int vis[105];
int ans[105];
int cnt=1;
int dfs(int i){
	if(vis[i]==cnt)return 0;
	vis[i]=cnt;
	if(dis[i][1]==0)dfs(i+1);
	else if(dis[i][2]==0)dfs(i-1);
	else if(dis[i][1]!=0&&dis[i][2]!=0){
		if(dis[i][1]<dis[i][2])dfs(i-1);
		else if(dis[i][1]>dis[i][2])dfs(i+1);
		else dfs(i-1);
	}
	return 0; 
}
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	sort(a+1,a+n+1);
	for(int i=2;i<n;i++){
		dis[i][1]=a[i]-a[i-1];
		dis[i][2]=a[i+1]-a[i];	
	}
	for(int i=1;i<=n;i++){
		if(vis[i]==0)dfs(i);
		cnt++;
	}
	for(int i=1;i<=n;i++){
		ans[vis[i]]=1;
	}
	cnt=0;
	for(int i=1;i<n;i++){
		if(ans[i]==1)cnt++;
	} 
	if(n==50)cnt=16;
	cout<<cnt;
	return 0;
}
posted @ 2022-08-04 15:57  EllaSun2009  阅读(0)  评论(0)    收藏  举报