Hoofball

16 篇文章 0 订阅
10 篇文章 0 订阅

传送门

题面描述:

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

题目分析:

首先要知道,被传递的球最终总是会落入某一个cycle中。那么所有这些分配下去的球,最终都会分别落入属于自己的cycle中。那我们就要看,在解最优的情况下(用最少数量的球使所有牛都能被传到球),每一个cycle分别传入了几个球,其总和就是答案。
对于一个cycle:若邻近它的左边那头牛的投球目标是这个cycle中的左牛,且邻近它的右边那头牛的投球目标是这个cycle中的右牛,那这个cycle将总共传入2只球;否则,这个cycle将总共传入1只球;。
Alt
先用一个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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yjonben

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值