题目:
协会正在举行一场对外的加时赛,在这场比赛中有n个小队,依次从1到n进行编号。
每一轮比赛后剩下小队的ID会重新按照顺序依次编号,然后按以下顺序进行比赛:第一队和第二队比,第三队和第四队比,依此类推。
可以保证在每一轮比赛中都有偶数个队。
每场比赛的获胜者晋级下一轮,失败者被淘汰出局,没有平局。
在最后一轮比赛中,只剩下两支小队,这一轮被称为决赛,获胜者被称作冠军。
大家都希望lh学长带领的小队和hz学长带领的小队进入决赛。
不幸的是,球队ID已经被确定了,lh学长和hz学长可能不会在决赛中相遇,因为如果他们足够强大,他们将在更早的阶段相遇。
请你预测一下,lh学长所在的ID为a和hz学长所在的ID为b的小队将会在哪一轮中碰面。
注意:lh学长的小队和hz学长的小队是所有小队中最强的存在!!!
Input
唯一的行包含三个整数n,a和b (2≤n≤256,1≤a,b≤n) 分别为参加比赛的小队总数,lh学长所带领的小队编号,hz学长所带领的小队编号。
可以保证,在每一轮比赛中,都有偶数个队晋级,并且a和b不相等。
Output
如果lh学长和hz学长可以在决赛中相遇,则输出唯一一行“Final!”(没有引号)
否则输出lh学长和hz学长相遇的轮数。
轮数是从1开始累计的。
Examples
Input
4 1 2
Output
1
Input
8 2 6
Output
Final!
Input
8 7 5
Output
2
Note
在第一个例子中,lh学长所在的1队和hz学长所在的2队在第1轮相遇。
在第二个例子中,lh学长所在的2队和hz学长所在的6队只可能在第3轮决赛时相遇(他们战胜了之前的所有对手)。
在第三个例子中,lh学长所在的7队和hz学长所在的5队可以在第2轮相遇(他们都在第1轮中赢得了对手)。
题解:
用一个sort将循环一次的且没有为零的数放在后面
k设定为每次sort以后的中值
如果k=n-1
可以知道两队在最后一轮相遇
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n,a,b,i,s[257],nn=1,k;
cin>>n>>a>>b;
for(i=1;i<=n;i++)
s[i]=i;
k=1;
while(k)
{
for(i=k;i<=n;i+=2)
{
if((s[i]==a||s[i]==b)&&(s[i+1]==a||s[i+1]==b))
{
if(k==n-1)
cout<<"Final!"<<endl;
else
cout<<nn<<endl;
return 0;
}
else if(s[i]==a||s[i]==b)
s[i+1]=0;
else if(s[i+1]==a||s[i+1]==b)
s[i]=0;
else
s[i]>s[i+1]?s[i+1]=0:s[i]=0;
} nn++;
sort(s+1,s+n+1);
k=k+(n-k+1)/2;
}
}