*(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
1≤N≤500;
80
80
80%的数据:
1
≤
N
≤
3000
1≤N≤3000
1≤N≤3000;
100
100
100%的数据:
1
≤
N
≤
100000
1≤N≤100000
1≤N≤100000。
解题思路
首先,一个桶(源代码中的
p
p
p数组)
然后先比较当前最左(源代码中的
h
h
h)和最右(源代码中的
t
t
t), 如果最左大于最右,则最左减最右,最右清零
t
−
1
t-1
t−1,如果最右大于最左,则最右减最左,最左清零,
h
+
1
h+1
h+1,否则就是最左等于最右,则最左与最右都清零,
h
+
1
,
t
−
1
h+1,t-1
h+1,t−1。
直到
t
−
l
<
=
1
t-l<=1
t−l<=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;
}