Codeforces 735C:Tennis Championship(数学+贪心)
Posted Shadowdsp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 735C:Tennis Championship(数学+贪心)相关的知识,希望对你有一定的参考价值。
http://codeforces.com/problemset/problem/735/C
题意:有n个人打锦标赛,淘汰赛制度,即一个人和另一个人打,输的一方出局。问这n个人里面冠军最多能赢多少场,其中一个人和另一个人能打比赛当且仅当这两个人赢的局数相差不超过1。
思路:比赛的时候不会做..直接log2(n)交,果断错了。看题解:因为限制条件两个人能比赛当且仅当他们赢得局数相差不超过1,设F[x]为冠军赢x盘的时候需要的总人数,那么有这样的递推式:F[x] = F[x-1] + F[x-2].(其中x-1的人和x-2的人打一盘,赢的人是x-1,就可以变成x了)。就是斐波那契数列。初始的时候F[1] = 2, F[2] = 3。因为斐波那契递增的很快,在1e18里面数量不多,所以先打出一个表,然后二分查找 n >= F[x] 的x,就是最后的答案了。
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <cmath> 5 #include <iostream> 6 using namespace std; 7 const int N = 10004; 8 9 10 long long dp[N]; 11 12 int main() { 13 long long n; 14 cin >> n; 15 dp[1] = 2; dp[2] = 3; 16 int r = 3; 17 for( ; ; r++) { 18 dp[r] = dp[r-1] + dp[r-2]; 19 if(dp[r] > 1e18) break; 20 } 21 int l = 1; 22 while(l <= r) { 23 int mid = (l + r) >> 1; 24 if(dp[mid] <= n) l = mid + 1; 25 else r = mid - 1; 26 } 27 printf("%d\n", r); 28 return 0; 29 }
以上是关于Codeforces 735C:Tennis Championship(数学+贪心)的主要内容,如果未能解决你的问题,请参考以下文章
CodeForces - 283E Cow Tennis Tournament
Tennis Game CodeForces - 496D(唯一分解定理,费马大定理)
Codeforces 283E Cow Tennis Tournament 线段树 (看题解)
CodeForces 496D Tennis Game (暴力枚举)