Tennis Championship

题目链接:http://codeforces.com/problemset/problem/735/C

    ——每天在线,欢迎留言谈论。

题目大意:

给你一个 n (2≤n≤10^18),代表一共有n位参加比赛的选手。

游戏规则:

①每次比赛,输的选手将离开赛场

②相互比赛的选手 他们的获胜的次数相差不能超过1(获胜4次的选手只能跟3或5次的选手比赛)

问题:最终赢得比赛的选手,胜场最多能为多少。

思路:

贪心:①选一名选手让他一直获胜且优先让他参加比赛

②当没有可比赛选手的时候(比如他胜为2时,其他选手胜场为0),就让另一个人的胜场达到比他少一场(恰好可以比赛),然后比赛输掉.

递推:

codeforces 735C Tennis Championship(贪心+递推)-LMLPHP

意思:产生一名胜场为x的选手,需要有y名选手出局

规律例:想要获得一胜5次的选手 需要 一名4次的选手+一名3次的选手 然后比赛后前者获胜后者出局。

n[i]=n[i-1]+n[i-2]+1(1为获胜 i-1 次的选手出局)

那么 : 答案就是n-1>=y对应的那个x对大的那个喽

AC代码:

 #include <iostream>
using namespace std;
typedef long long ll;
ll a[]={,};
int main()
{
for(int i=;i<=;i++)
{a[i]=a[i-]+a[i-]+;}
ll n;
cin>>n;
n-=;
for(int i=;i<=;i++)
if(n<a[i])
{
cout<<i-<<endl;
return ;
}
//通过计算a[90]已经为 7e18多了,为题目给定n 的3倍多!
cout<<""<<endl;
return ;
}

2017-05-27 19:25:29

05-07 15:08
查看更多