Hoofball
传送门
题面描述:
有n头牛站在x轴上不同位置,现挑出一些牛给它们每牛一只球,得到球的牛会将球传递给别的牛,传递的规则是:传给离自己最近的牛,若多头牛同时离自己最近,传给最左边那头牛。问至少需要多少个球去分配给这些牛,使得所有牛都能被传到球。
题目分析:
首先要知道,被传递的球最终总是会落入某一个cycle中。那么所有这些分配下去的球,最终都会分别落入属于自己的cycle中。那我们就要看,在解最优的情况下(用最少数量的球使所有牛都能被传到球),每一个cycle分别传入了几个球,其总和就是答案。
对于一个cycle:若邻近它的左边那头牛的投球目标是这个cycle中的左牛,且邻近它的右边那头牛的投球目标是这个cycle中的右牛,那这个cycle将总共传入2只球;否则,这个cycle将总共传入1只球;。
先用一个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;
}