题目大意:
Smart和Sarah为了让他们种的小麦的高度相同,决定玩以下的游戏:
1、当轮到Smart的时候,他会选择最短的那个小麦,然后延长高度到第二短的小麦的高度。
2、当轮到Sarah的时候,她会选择最长的那个小麦,然后剪短高度到第二长的小麦的高度。
游戏如果能继续的话,小麦中必须有三种不同的高度,如果有人不能再继续游戏,那么他就失败了。
给定所有小麦的高度,假设从Smart开始游戏,写一个程序决出游戏中谁是胜者,并输出游戏结束时最高的和最低的小麦的高度。
思路:
这道题是一道暴力模拟的问题。我们先用桶排,计算每种长度的小麦各有几个,接着暴力模拟,可以轻(kun)松(nan)地出奇迹。
由于编程过程较容易理解,所以在此不多解释了。
代码:
#include <cstdio>
#include <iostream>
using namespace std;
int a[100001],b[100001],c[100001],n,x,l,r;
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);
a[x]++; //桶排序
}
for (int i=1;i<=100000;i++)
if (a[i]>0)
{
r++;
b[r]=a[i]; //从小到大小麦依次的高度
c[r]=i; //小麦的编号
}
l=1;
if (r-l<=1) //特殊情况(还没开始就结束了)
{
printf("Sarah\n%d %d",c[l],c[r]);
return 0;
}
while (r-l>1) //结束条件
{
if (b[r]>b[l])
{
b[r]-=b[l];
b[r-1]+=b[l];
b[l+1]+=b[l];
b[l]=0;
}
else
{
b[l]-=b[r];
b[l+1]+=b[r];
b[r-1]+=b[r];
b[r]=0;
}
if (b[l]==0) l++;
if (b[r]==0) r--; //暴力模拟
}
if (b[l]<=b[r]) printf("Sarah\n%d %d",c[l],c[r]);
else printf("Smart\n%d %d",c[l],c[r]);
return 0;
}