zoukankan      html  css  js  c++  java
  • 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
    ", r);
    28     return 0;
    29 }
  • 相关阅读:
    分享50个漂亮的设计师个人作品集网站案例
    Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
    ajax异步请求
    angularJS(6)
    angularJS(5)
    PHP实现RTX发送消息提醒
    ajax异步请求
    angularJS(4)
    angularJS(3)
    jsPanel插件Option总结
  • 原文地址:https://www.cnblogs.com/fightfordream/p/6109251.html
Copyright © 2011-2022 走看看