4 条题解
-
0
我们可以直接分类讨论
大致思路
首先两个人的最优方法肯定是抢先来到另外一个人的旁边,逼迫他(她)只能向另一个方向走,从而让他(她)先走到边缘无法移动。
所以就看谁先遇到另一人,让另一人只能向边缘走。
小细节
这里有一个小细节,如果他们开局就相邻,那作为先手的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
由于这题数据范围很小,所以
我们可以为所欲为方法很简单分析一下:
自己在草稿纸上画了一下,发现在两人相遇前,前进与后退都不会影响最终结果。而且胜利的条件就是让对方后退到无路可走,所以在相遇前两人都要尽可能地前进,在相遇后其中一方就会被步步紧逼,一直后退。所以若模拟全过程关键就是:在双方相遇(两枚棋子紧挨)后轮到谁走棋,谁就输。
模拟法:
#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
信息
- ID
- 8693
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 4
- 标签
- 递交数
- 28
- 已通过
- 18
- 上传者