Hoofball

传送门

题面描述:

有n头牛站在x轴上不同位置,现挑出一些牛给它们每牛一只球,得到球的牛会将球传递给别的牛,传递的规则是:传给离自己最近的牛,若多头牛同时离自己最近,传给最左边那头牛。问至少需要多少个球去分配给这些牛,使得所有牛都能被传到球。

题目分析:

首先要知道,被传递的球最终总是会落入某一个cycle中。那么所有这些分配下去的球,最终都会分别落入属于自己的cycle中。那我们就要看,在解最优的情况下(用最少数量的球使所有牛都能被传到球),每一个cycle分别传入了几个球,其总和就是答案。
对于一个cycle:若邻近它的左边那头牛的投球目标是这个cycle中的左牛,且邻近它的右边那头牛的投球目标是这个cycle中的右牛,那这个cycle将总共传入2只球;否则,这个cycle将总共传入1只球;。
Hoofball
先用一个b[]数组保存每只牛是向左还是向右传球,再遍历一次看看每个cycle里面会传进来1个还是2个球,全部加起来就是答案。

代码:

#include<algorithm>
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<queue>
#include<vector>
using namespace std;
int i,n,a[105],b[105],ans=0;//b表示每个牛往左或右踢 


int main(){
	cin>>n;
	for(i=0;i<n;i++) cin>>a[i];
	sort(a,a+n);
	memset(b,-1,sizeof(b));
	b[0]=1,b[n-1]=0;
	for(i=1;i<n-1;i++){
		if(a[i+1]-a[i]<a[i]-a[i-1]) b[i]=1;//往右
		else b[i]=0; 
	}
	for(i=0;i<n-1;i++){
		if(b[i]==1&&b[i+1]==0){//成环 
			ans++,i++;
			if(b[i+1]==0&&b[i-2]==1) ans++;
		}
		else continue;
	}
	cout<<ans;
}