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;//功德圆满
}