题目描述
为即将到来的马蹄球锦标赛做准备,Farmer约翰正在训练他的 N 头奶牛(1≤N≤100)传球。奶牛都站在牛舍一侧的一条很长的线上,奶牛 i站在距离牛舍 xi 个单位的位置(1≤xi≤1000)。每头牛都站在不同的位置。在演习开始时,Farmer John 会将几个球传给不同的奶牛。当奶牛 i 收到来自 Farmer John 或另一头奶牛的球时,她会将球传给离她最近的奶牛(如果多头奶牛与她的距离相同,她会将球传给最左边的奶牛)。为了让所有奶牛至少得到一点练习传球,Farmer John 希望确保每头奶牛至少握住一个球一次。假设他将球交给一组适当的初始奶牛,帮助他找出他最初需要分配的最小球数以确保发生这种情况。
输入
第一行包含 N。第二行包含 N个整数,第 i 个整数是 xi.
输出
请输出 Farmer John 最初必须传给奶牛的最小球数,这样每头奶牛至少可以握住一个球。
样例输入
5
7 1 3 11 4
样例输出
2
代码
#include<bits/stdc++.h>
using namespace std;
int n,a[105],d[105][5],cnt=1,ans[1005];
int f[105];
int dfs(int i)
{
if(f[i]==cnt) return 0;
f[i]=cnt;
if(d[i][1]==0) dfs(i+1);
else if(d[i][2]==0) dfs(i-1);
if(d[i][1]!=0&&d[i][2]!=0)
{
if(d[i][1]<d[i][2]) dfs(i-1);
else if(d[i][1]>d[i][2]) dfs(i+1);
else dfs(i-1);
}
return 0;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+n+1);
d[1][2]=a[2]-a[1];
d[n][1]=a[n]-a[n-1];
for(int i=2;i<n;i++)
{
d[i][1]=a[i]-a[i-1];
d[i][2]=a[i+1]-a[i];
}
for(int i=1;i<=n;i++)
{
if(f[i]==0) dfs(i);
cnt++;
}
for(int i=1;i<=n;i++)
{
ans[f[i]]=1;
}
cnt=0;
for(int i=1;i<=105;i++)
{
if(ans[i]==1) cnt++;
}
cout<<cnt<<endl;
return 0;
}