4 条题解

  • 0
    @ 2026-7-15 14:43:07

    我们可以直接分类讨论

    大致思路

    首先两个人的最优方法肯定是抢先来到另外一个人的旁边,逼迫他(她)只能向另一个方向走,从而让他(她)先走到边缘无法移动。

    所以就看谁先遇到另一人,让另一人只能向边缘走。

    小细节

    这里有一个小细节,如果他们开局就相邻,那作为先手的Alice就只能向边缘走,加上这一特判即可。

    (但实则此时两人相距1,也可以归到Alice先到,Borys后到相遇然后被逼走的情况中,所以可以忽略......)

    AC代码

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    	int n,a,b;scanf("%d%d%d",&n,&a,&b);
    	if((b-a)%2)puts("Borys");
    	else puts("Alice");
    	/*
    		如果两人之间需要相遇的步数为奇数步,那就是作为先手的Alice先到 
    		但后手的Borys走完后才相遇,所以是先手被逼迫向边缘走,故后手borys赢 
    		反之则是先手逼迫后手走,故先手Alice赢 
    	*/
    	return 0;
    }
    

    tip:

    比赛时想复杂了,以为还有别的情况,卡了我40min......

    • 0
      @ 2026-7-15 0:20:19

      由于这题数据范围很小,所以我们可以为所欲为方法很简单

      分析一下:

      自己在草稿纸上画了一下,发现在两人相遇前,前进与后退都不会影响最终结果。而且胜利的条件就是让对方后退到无路可走,所以在相遇前两人都要尽可能地前进,在相遇后其中一方就会被步步紧逼,一直后退。所以若模拟全过程关键就是:在双方相遇(两枚棋子紧挨)后轮到谁走棋,谁就输。

      模拟法:

      #include<iostream>
      using namespace std;
      int main()
      {
      	int n,x,y,tot=0;cin>>n>>x>>y;
      	while(1)
      	{
      		if(x+1==y)
      		{
      			if(tot%2)cout<<"Alice";
      			else cout<<"Borys";
      			return 0;
      		}//这里需要注意的是有可能一开始两枚棋子就紧挨着,所以在走棋前要先判断
      		if(!tot%2)x++;
      		else y--;
      		tot++;//记录总步数
      	}//每次循环完成一步走棋
      	return 0;
      } 
      

      然而还有一种方法(虽然有dalao说过了),既然这里的判断关键是两人相遇前走的总步数,那直接对这个总步数进行奇偶判断就可以了。

      数学法:

      #include<iostream>
      #include<cstring>
      using namespace std;
      int main()
      {
      	int n,x,y;cin>>n>>x>>y;
      	string ans=(y-x)%2?"Borys":"Alice";
      	cout<<ans;
      	return 0;
      } 
      

      就这样。其实还挺简单的。

      希望这篇题解对大家有所帮助。

      • -1
        @ 2026-7-15 14:25:41
        #include<bits/stdc++.h>
        using namespace std;
        signed main()
        {
        	int a,b,c;cin>>a>>b>>c;
        	if((b+c)&1)cout<<"Borys";
        	else cout<<"Alice";
        	return 0;
        }
        • -2
          @ 2026-7-15 14:48:51

          发一篇最短代码(代码来源于kevin)(有人能压更多吗)

          #include<iostream>
          int main(){int a,b,c;std::cin>>a>>b>>c;std::cout<<((b+c)&1?"Borys":"Alice");}
          
          • 1

          信息

          ID
          8693
          时间
          1000ms
          内存
          512MiB
          难度
          4
          标签
          递交数
          28
          已通过
          18
          上传者