列表

详情


NC200439. jcc爱踢球

描述

世界杯足球赛的最后一个阶段是用附加赛制度进行的。

这一阶段还剩n支队伍,从1n进行计数。

进行几轮,在每轮中,剩余的队伍按其ID的顺序进行排序,

然后按此顺序第一支队伍与第二支队伍、第三支队伍与第四支队伍、第五支队伍与第六支队伍进行比赛,依此类推。

保证每一轮都有偶数支队伍。每场比赛的赢家晋级下一轮,输家被淘汰出局,没有平局。

在最后一轮比赛中,只有剩下两支队伍:这一轮称为决赛,胜者称为冠军,比赛结束。

jcc想让他最喜欢的两支球队参加决赛。

不幸的是,球队的身份已经确定,可能会发生球队不可能在决赛中相遇的情况,不过jcc非常有钱,

可以通过花钱来决定任意两只队伍的胜负,所以确保了,b一定会在某场比赛相遇,但由于赛制问题,不能保证在决赛相遇,但会保证他们能相遇。

求具有a和b两只队伍在多少轮之后可以相遇,若能在决赛相遇,则输出“Final!”,否则输出在多少轮之后可以相遇。

输入描述

唯一一行包含三个整数n,a和b(2 ≤ n ≤ 256, 1 ≤ a,b ≤ n)-代表团队总数,以及jcc感兴趣的团队的ID。(a!=b)

输出描述

如果aa队和bb队能在决赛中相遇,在唯一的一行中打印“Final!”。

否则,请打印一个整数,表示a和b在多少轮之后可以相遇。

示例1

输入:

4 1 2

输出:

1

示例2

输入:

8 2 6

输出:

Final!

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C(clang 3.9) 解法, 执行用时: 9ms, 内存消耗: 504K, 提交时间: 2019-12-16 23:11:18

#include <stdio.h>
#include <math.h>
int main()
{
	int n,a,b,i,j,k,sum=0;
	scanf("%d%d%d",&n,&a,&b);
    n=log2(n);
		while(a!=b)
		{
			a=(a+1)/2;
        	b=(b+1)/2;
        	sum++;
		}
    if(n==sum)
        printf("Final!");
    else
		printf("%d\n",sum);
}

C++14(g++5.4) 解法, 执行用时: 3ms, 内存消耗: 492K, 提交时间: 2019-12-15 17:08:56

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,a,b;
	cin>>n>>a>>b;
	int cnt=0;
    n=log2(n);
	while(a!=b)
	{
	   a = (a + 1)/2;
    b = (b + 1)/2;
	  cnt++;
	}
	if(cnt==n) cout<<"Final!"<<endl;
	else cout<<cnt<<endl; 
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 512K, 提交时间: 2019-12-18 10:28:05

#include<stdio.h>
#include<math.h>
int main(void)
{
	int n,a,b,i=0;
	scanf("%d%d%d",&n,&a,&b);
	n=log2(n);
	while(a!=b)
	{
		a=(a+1)/2;
		b=(b+1)/2;
		i++;
	}
	if(i==n)
	printf("Final!");
	else
	printf("%d",i);
	return 0;
}

上一题