2 条题解

  • 2
    @ 2026-5-11 13:03:48

    个人感觉比原题解要好一点

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e5+10,M=1e6+10;
    string s1[N],s2[N];
    int main(){
    	int n,m;scanf("%d%d",&n,&m);
    	for(int i=1;i<=n;i++)cin>>s1[i];
    	for(int i=1;i<=m;i++)cin>>s2[i];
    	int l1=1,l2=1,tk=1;
    	string now=s1[1];
    	while(1){
    		if(tk==0){
    			while(l1<=n){
    				if(s1[l1]>now)break;
    				l1++;
    			}
    			if(l1>n||(s1[l1][0]-now[0])>=2)break;
    			now=s1[l1];
    			tk=1-tk;
    		}
    		else{
    			while(l2<=m){
    				if(s2[l2]>now)break;
    				l2++;
    			}
    			if(l2>m||(s2[l2][0]-now[0])>=2)break;
    			now=s2[l2];
    			tk=1-tk;
    		}
    	}
    	if(tk==0)printf("Zoe\n");
    	else printf("Leona\n");
    	return 0;
    }
    
    
    • 1
      @ 2026-5-12 10:55:35

      代码好理解,较费时间,自罚不为最优解...

      #include<bits/stdc++.h>
      using namespace std;
      string a[100005],b[100005];
      bool check(string m,string t)
      {
      	if(m>=t)return 0;//字典序更小,不符合条件 
      	else if(m[0]!=t[0]&&m[0]!=(t[0]-1))return 0;
      	//不满足第一个字符的条件:相同或上一个字母 
      	return 1;
      }
      int main()
      {
      	int n,m;cin>>n>>m;
      	for(int i=1;i<=n;i++)cin>>a[i];
      	for(int i=1;i<=m;i++)cin>>b[i];
      	sort(a+1,a+n+1);sort(b+1,b+m+1);
      	for(int i=1,j=1;i<=n||j<=m;)
      	{
      		while(j<=m&&!check(a[i],b[j]))j++;//往后找能接上的单词 
      		if(j>m){cout<<"Leona"<<'\n';break;}//找不到,输了 
      		i++;//下一次只能继续向下接 
      		while(i<=n&&!check(b[j],a[i]))i++;
      		if(i>n){cout<<"Zoe"<<'\n';break;} 
      		j++;//同理 
      	}
      	return 0;
      }
      
      • 1

      信息

      ID
      7104
      时间
      1000ms
      内存
      512MiB
      难度
      6
      标签
      递交数
      29
      已通过
      11
      上传者