SSLZYC 小麦高度

题目大意:
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;
}
原文地址:https://www.cnblogs.com/hello-tomorrow/p/9313126.html