(纪中)2251. 小麦高度

57 篇文章 0 订阅

*(File IO): input:wheat.in output:wheat.out
时间限制: 1000 ms 空间限制: 262144 KB 具体限制


题目描述
S m a r t Smart Smart S a r a h Sarah Sarah在每年的圣诞节都要种植小麦。众所周知,小麦的生长速度不同,经过一段时间后,种植的小麦会参差不齐。他们决定玩以下的游戏来解决这个问题:
1、当轮到 S m a r t Smart Smart的时候,他会选择最短的那个小麦,然后延长高度到第二短的小麦的高度。
2、当轮到 S a r a h Sarah Sarah的时候,他会选择最长的那个小麦,然后剪短高度到第二长的小麦的高度。
游戏如果能继续的话,小麦中必须有三种不同的高度,如果有人不能再继续游戏,那么他就失败了。
给定所有小麦的高度,假设从 S m a r t Smart Smart开始游戏,写一个程序决出游戏中谁是胜者,并输出游戏结束时最高的和最低的小麦的高度。


输入
第一行输入一个整数 N N N,表示小麦的数量。
第二行输入 N N N个用个空格隔开的整数,表示每个小麦的高度,小麦高度都不超过 100000 100000 100000

输出
输出的第一行为 " S m a r t " "Smart" "Smart"表示 S m a r t Smart Smart赢得游戏,为 " S a r a h " "Sarah" "Sarah"表示 S a r a h Sarah Sarah赢得游戏。
输出第二行的两个数分别表示游戏结束时最低和最高的小麦长度。


样例输入
样例输入1
3
3 4 3

样例输入2
5
3 1 2 4 1

样例输入3
7
2 1 3 3 5 4 1

样例输出
样例输入1
Sarah
3 4

样例输入2
Smart
2 3

样例输入3
Sarah
2 3


数据范围限制
50 50 50%的数据: 1 ≤ N ≤ 500 1≤N≤500 1N500
80 80 80%的数据: 1 ≤ N ≤ 3000 1≤N≤3000 1N3000
100 100 100%的数据: 1 ≤ N ≤ 100000 1≤N≤100000 1N100000


解题思路
首先,一个桶(源代码中的 p p p数组)
然后先比较当前最左(源代码中的 h h h)和最右(源代码中的 t t t), 如果最左大于最右,则最左减最右,最右清零 t − 1 t-1 t1,如果最右大于最左,则最右减最左,最左清零, h + 1 h+1 h+1,否则就是最左等于最右,则最左与最右都清零, h + 1 , t − 1 h+1,t-1 h+1t1
直到 t − l < = 1 t-l<=1 tl<=1
然后比较 p [ t ] p[t] p[t] p [ h ] p[h] p[h],输出。


代码

#include<bits/stdc++.h>
int a[100001],p[100001],bsy[100001];
int n,t=0,h=1,w=0,x=0;
int main()
{
	freopen("wheat.in","r",stdin);
	freopen("wheat.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&x);
		bsy[x]++;
	}
	for(int i=1;i<=100000;i++)
		if(bsy[i]!=0)
		{
			p[++t]=bsy[i];
			a[t]=i;
		}
	int x=0;
	if(t-h+1<3)
		printf("Sarah\n");
	else
	{
		while(t-h+1>=3)
		{
			if(p[t]>p[h])
				x=p[h];
			else
				x=p[t];
			p[t]-=x;
			p[h]-=x;
			p[h+1]+=x;
			p[t-1]+=x;
			if(p[t]==0)
				t--;
			if(p[h]==0)
				h++;
		}
		if(p[h]<=p[t])
			printf("Sarah\n");
		else
			printf("Smart\n");
	}
	printf("%d %d",a[h],a[t]);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值