Codeforces #382 C Tennis Championship

里约热内卢举办了一场网球锦标赛,采用淘汰赛规则。题目要求找出冠军最多能参加多少场比赛。已知两名选手之间的比赛,必须满足一方已赛次数与另一方相差不超过1。输入为参赛人数n(2≤n≤10^18),输出冠军最多能参加的比赛数。例如,当n=2时,答案为1;n=3时,答案为2;n=4时,答案为2,因为冠军最多只能与2名选手比赛,之后无法满足比赛规则。
C. Tennis Championship
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Famous Brazil city Rio de Janeiro holds a tennis tournament and Ostap Bender doesn't want to miss this event. There will be n players participating, and the tournament will follow knockout rules from the very first game. That means, that if someone loses a game he leaves the tournament immediately.

Organizers are still arranging tournament grid (i.e. the order games will happen and who is going to play with whom) but they have already fixed one rule: two players can play against each other only if the number of games one of them has already played differs by no more than one from the number of games the other one has already played. Of course, both players had to win all their games in order to continue participating in the tournament.

Tournament hasn't started yet so the audience is a bit bored. Ostap decided to find out what is the maximum number of games the winner of the tournament can take part in (assuming the rule above is used). However, it is unlikely he can deal with this problem without your help.

Input

The only line of the input contains a single integer n (2 ≤ n ≤ 1018) — the number of players to participate in the tournament.

Output

Print the maximum number of games in which the winner of the tournament can take part.

Examples
input
2
output
1
input
3
output
2
input
4
output
2
input
10
output
4
Note

In all samples we consider that player number 1 is the winner.

In the first sample, there would be only one game so the answer is 1.

In the second sample, player 1 can consequently beat players 2 and 3.

In the third sample, player 1 can't play with each other player as after he plays with players 2 and 3 he can't play against player 4, as he has 0 games played, while player 1 already played 2. Thus, the answer is 2 and to achieve we make pairs (1, 2) and (3, 4) and then clash the winners.

题目大意:现在进行一场网球公开赛,淘汰赛,输一场就出局,然后每个人的对手必须是胜场和这个人相差不到一局的人,输者淘汰,现在问题来了,冠军最多会进行多少场比赛。
题目分析:做这题的时候我的精神已经恍惚了,看来已经不年轻了,以后看来熬夜打cf是不行了,还是第二天再打吧。先自己手算一下场数。
  n=1时,答案是0      
  n=2的时候,答案是1,
  n=3,4, 的时候,答案是2,
  n=5,6 , 7的时候,答案是3,
  n=8,9,10,11,12的时候,答案是4.
  由此可以发现满足以场数为下标的斐波那契数列。f[i]即为冠军胜场为i时所需要的最少人数。F【n】=F【n-1】+F[n-2];
  因此,当第一个f【i】>n时,i-1就是答案。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 91;
long long f[maxn];
int main(){
	long long t,n,k;
	f[1]=2;f[2]=3;
	for(int i= 3;i<=maxn;i++)
	   f[i]=f[i-1]+f[i-2];
	while(~(scanf("%I64d",&n))){
		int i;
	    for(i=1;i<=maxn;i++){
	    	if(f[i]>n)
			  break; 
		}
		printf("%d\n",i-1);
	}
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值