P9738

· · 题解

这是本蒟蒻的第一篇题解,有错误请指出。

思路 : 将 Leona 和 Zoe 的单词排好序后,每次寻找 Leona 和 Zoe 是否有单词可说,若没有就输出赢家, 若有就继续循环。

附代码:

#include<bits/stdc++.h>
using namespace std;
int n , m;
string l[100001], z[100001];
int lmi = 2, zmi = 1;
/*
    lmi:lmi每次存Leona说出单词位置,再从lmi找到n,
    因为lmi之前要比现在说出单词要小,所以没必要找。 
    zmi: 同理。 
*/
int ansl = 1, ansz = 1;
/*
    ansl:记入Leona是否还能说出单词。 
    ansz:记入Zoe是否还能说出单词。 
*/
string nowl, nowz;
/*
    nowl:记入Leona说出的单词的最后一个。 
    nowz:记入Zoe出的单词的最后一个。 
*/
int main()
{
    cin >> n >> m;
    for(int i=1;i<=n;i++)
    {
        cin >> l[i];
    }
    for(int i=1;i<=m;i++)
    {
        cin >> z[i];
    }
    sort(l+1,l+n+1);
    sort(z+1,z+m+1);// 排序 
    nowl = l[1];
    while(ansl&&ansz)//其中一个没有答案就跳出 
    {
        ansl = ansz = 0;
        for(int i=zmi;i<=m;i++)
        {
            char w = nowl[0] + 1;
            if((z[i][0] == nowl[0]&&z[i] > nowl)||(w == z[i][0]))
            {
                nowz = z[i];//如果Zoe可以说就更新nowz,zmi,ansz。 
                zmi = i + 1;
                ansz = 1;
                break;
            }
        }
        if(!ansz)
        {
            ansl = 1;
            break;
        }
        for(int i=lmi;i<=n;i++)
        {
            char w = nowz[0] + 1;
            if((l[i][0] == nowz[0]&&l[i] > nowz)||(l[i][0] == w))
            {
                nowl = l[i];//如果Leona可以说就更新nowl,lmi,ansl。 
                lmi = i + 1;
                ansl = 1;
                break;
            }
        }
        if(!ansl)
        {
            ansz = 1;
            break;
        }
    }
    if(!ansz) cout << "Leona";
    else cout << "Zoe";
    return 0;//功德圆满 
}