ACM模版

描述

题解

一看就是博弈论,但是一开始没有想通是什么思路,后来发现,这个最后的奇偶性其实就和最后留下来的数中奇数的个数有关,所以我们只需要判断一下谁会对最后的奇数个数有决定性影响即可。

那么首先我们需要累计出奇数城市和偶数城市的个数以及先手和后手出手次数,这样,结合所需要保留的城市数,我们可以分为大致三种情况,只剩下奇数城市,只剩下偶数城市,剩下的城市奇数偶数都有。对于第一种情况,我们只需要根据剩下的城市数来判断即可,而第二种情况就很明了了,至于第三种情况,我们需要判断谁最后一次取,最后一次取的人起决定性作用。

代码

#include <iostream>

using namespace std;

void D_win()
{
    cout << "Daenerys" << endl;
}

void S_win()
{
    cout << "Stannis" << endl;
}

int n, k;

int main()
{
    scanf("%d%d", &n, &k);

    int cnt1 = 0, cnt2, x;
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &x);
        if (x & 1)
        {
            cnt1++;
        }
    }
    cnt2 = n - cnt1;

    int D_cnt = (n - k) >> 1;   // 后手取的次数
    int S_cnt = (n - k) & 1 ? D_cnt + 1 : D_cnt;

    if (cnt1 <= D_cnt)
    {
        D_win();
        return 0;
    }

    if (((k & 1) == 0) && cnt2 <= D_cnt)
    {
        D_win();
        return 0;
    }

    if (((k & 1) == 1) && cnt2 <= S_cnt)
    {
        S_win();
        return 0;
    }

    if (n == k)
    {
        if ((cnt1 & 1) == 0)
        {
            D_win();
        }
        else
        {
            S_win();
        }
        return 0;
    }

    if (S_cnt > D_cnt)
    {
        S_win();
    }
    else
    {
        D_win();
    }

    return 0;
}