Hoofball(B题)

题面:

在这里插入图片描述

题目大意:

为了准备即将到来的马蹄球锦标赛,农夫约翰正在训练他的N头奶牛。奶牛都站在谷仓的一边,排成一条很长的队伍,奶牛站在单位离开谷仓(1< xi< 1000)。每头牛都站在不同的位置。在训练开始时,农夫约翰会把几个球传给不同的奶牛。当奶牛收到一个球时,不是来自农夫约翰,就是来自另一头牛。
她会把球传给离她最近的奶牛(如果有几头奶牛离她同样的距离,她会把球传给她左边的奶牛)。为了让所有的奶牛都得到至少一点传球的练习,农场主约翰想要确保每头奶牛都至少拿过一次球。假设他将球交给一组合适的初始奶牛,帮助他计算出他最初需要分发的球的最小数量,以确保这一点能够实现。

数据大小:

N(1<=N<=100)

思路:

强大的队友用的是dp来求,可惜我不会。但是题目数据很小,而我又很会乱搞 ,于是我模拟出了一种可行的方法。首先,因为奶牛们在相同距离的时候会把球传给左边的奶牛,那么很贪心的想法就是先把球给最右边的奶牛,然后不断地传传传,直到不能传给下一位奶牛,就停止,再给一个新的球给下一位奶牛直到最左边的奶牛踢到了球。
但是。。。事情还没有完,因为当出现:
1 1000 998 995 990…这样的从左边贪心更优的情况时,我们就gg了。
所以我们要从右到左,左到右贪两遍。(不是正解,仅供参考)
ac丑代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include <vector>
#include<algorithm>
using namespace std;
typedef long long ll;
#define MAX 100005
#define INF 10000000
int vis[105];
int main()
{
	int n;
	int a[105];
	scanf("%d",&n);
	for(int i = 0;i<n;i++)
		scanf("%d",&a[i]);
	sort(a,a+n);
	int sum = 1;//传给最后一位
	vis[n-1] = 1;
	for(int i = n-2;i > 0;i--)
	{
		if((a[i+1]-a[i]) >= (a[i]-a[i-1]))
			continue;//可以传球
		else
		{
			sum++;
			vis[i-1] = 1;//标记给球的奶牛编号
		}
	}
	for(int i = 0;i<n;i++)//从左到右贪心
	{
	//第i个有球,往后贪心,遇到有球的奶牛就把球收回去,因为从第i个可以传到现在的位置
		if(vis[i])
		{
			for(int j = i;j<n-1;j++)
			{
				if(j == 0)
				{
					if(vis[1])sum--;
					vis[1] = 0;
					continue;
				}
				if(a[j]-a[j-1] > a[j+1]-a[j])
				{
					if(vis[j+1])
					{
						sum--;
						vis[j+1] = 0;
					}
				}
				else break;
			}
		}
	}
	printf("%d",sum);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值