CF735C 数论\平衡树叶子节点的最大深度\贪心\斐波那契\条件归一化
http://codeforces.com/problemset/problem/735/C
题意。。采用淘汰赛制。。只要打输就退出比赛。。而且只有两个选手打过的场数
相差不超过1才能比赛。。最后问你。。最多打几场比赛能决出冠军
那么这个题的做法是。。画图。。观察。。分析
Tip:首先我们观察未知量的形式。。它是一个复合函数的形式。。max(决出冠军的所有可能的比赛方式的场数)
那么我们首先要求括号最里面的东西。。即符合条件的所有可能的比赛方式的场数
那么我们可以画一画

我一开始为了保证比赛能正常进行。。不会像第一个图那样。。由于深度差太多无法比完所有选手。。因而无法决出冠军
所以两两比赛。。这样深度就有保证了。。但是回过头来。。是不是不符合题设最大的场数这个条件呢,这里我当时没法判断
由于我每次都把相邻的两两合并。。所以当然没有发现数量为8的时候。。最大可以为4场比赛
这个应该属于手玩数据的瑕疵?没什么经验。。
但是一旦你注意到了一个基础的事实。。冠军每次和比自己场数低的比能打得比和相同场数的选手多(有可能)。。因为同样都是增加一场比赛,和场数低的选手比
就能消耗更少的选手,那么你就可能需要更多的场次和剩余选手比赛。。
这个贪心策略我当时只是闪过一下。。因为我害怕这种策略无法满足完成比赛的条件。。而且一直没有找到这种策略能过的例子。。并且还有第一个例子挡在我的面前
所以我就放弃了。。题意都没有观察清楚。。
但其实如果你遵循这种策略造成了第一个例子最后剩一个没法比的情况。。那么你就不要和比自己场次低的比。。提升到相等即可符合条件过掉比赛
什么?你担心场次变化?多算几组?一样的好吧。。提升到相等的选手和它比场次不会增加也不会减少。。
那么知道了这个贪心策略之后。。我们可以计算答案了
观察可以得到这是一个斐波那契的结构。。
然后感觉有点迷糊。。
到底怎么统计答案啊
Tip:我们经过硬看之后。。发现图上的这个数字和连边操作的语义是。。生成一个比了某某场次的选手需要消耗多少名选手
那么我们消耗完所有的选手。。就能计算出最多能生成多少场次的选手。。根据这个过程我们用斐波那契去逼近
由于斐波那契的性质。。我们可以知道斐波那契数列可以非常快地收敛于参赛选手的数量
所以当我们分清了图上的过程和语义之后以及有了和谐不能完成比赛的策略和贪心的策略我们就能用ll,快速地统计答案
代码如下
#include <iostream>
#include <cstdio> using namespace std;
typedef long long ll;
ll n;
ll f[];
int main(){
scanf("%I64d",&n);
f[]=;f[]=*f[];
int i;
for(i=;i<=;++i){
f[i]=f[i-]+f[i-];
if(f[i]>=n) break;
}
if(f[i]>n) i--;
printf("%d\n",i);
return ;
}
由于深度相差小于等于1的节点才能合并。。那么我们就能把它看成是一颗平衡树。。那么题设就是在求这个平衡树的叶子节点的最大深度
CF735C 数论\平衡树叶子节点的最大深度\贪心\斐波那契\条件归一化的更多相关文章
- 2018.10.08 NOIP模拟 斐波那契(贪心+hash/map)
传送门 签到题. 显然是可以贪心分组的,也就是尽量跟当前的分成一组. 这时我们需要判断a[l]+a[r],a[l+1]+a[r]...a[r−1]+a[r]a[l]+a[r],a[l+1]+a[r]. ...
- ACM/ICPC 之 数论-斐波拉契●卢卡斯数列(HNNUOJ 11589)
看到这个标题,貌似很高大上的样子= =,其实这个也是大家熟悉的东西,先给大家科普一下斐波拉契数列. 斐波拉契数列 又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.… ...
- 【斐波拉契+数论+同余】【ZOJ3707】Calculate Prime S
题目大意: S[n] 表示 集合{1,2,3,4,5.......n} 不存在连续元素的子集个数 Prime S 表示S[n]与之前的所有S[i]互质; 问 找到大于第K个PrimeS 能整除X 的第 ...
- ***1133. Fibonacci Sequence(斐波那契数列,二分,数论)
1133. Fibonacci Sequence Time limit: 1.0 secondMemory limit: 64 MB is an infinite sequence of intege ...
- 数论+矩阵快速幂|斐波那契|2014年蓝桥杯A组9-fishers
标题:斐波那契 斐波那契数列大家都非常熟悉.它的定义是: f(x) = 1 .... (x=1,2) f(x) = f(x-1) + f(x-2) .... (x>2) 对于给定的整数 n 和 ...
- 2018年东北农业大学春季校赛 K wyh的数列【数论/斐波那契数列大数取模/循环节】
链接:https://www.nowcoder.com/acm/contest/93/K来源:牛客网 题目描述 wyh学长特别喜欢斐波那契数列,F(0)=0,F(1)=1,F(n)=F(n-1)+F( ...
- 求二叉树的深度,从根节点到叶子节点的最大值,以及最大路径(python代码实现)
首先定义一个节点类,包含三个成员变量,分别是节点值,左指针,右指针,如下代码所示: class Node(object): def __init__(self, value): self.value ...
- Java 用自带dom解析器遍历叶子节点内容
一.XML文件config.xml,内容如下: <?xml version="1.0" encoding="UTF-8" standalone=" ...
- jquery zTree 查找所有的叶子节点
jquery zTree 查找所有的叶子节点 // 保存所有叶子节点 10 为初始化大小,并非数组上限 var arrayObj = new Array([10]); /* treeNode: 根节点 ...
随机推荐
- Light OJ 1032
数位dp,许多数位dp需要统计某种模式(子串)出现的数量,这种题通常需要在递归参数中加入高位已经出现过的模式的数量. #include <cstdio> #include <cstr ...
- Linux下编译安装python3
Linux下默认系统自带python2.6的版本,这个版本被系统很多程序所依赖,所以不建议删除,如果使用最新的Python3那么我们知道编译安装源码包和系统默认包之间是没有任何影响的,所以可以安装py ...
- suse linux 10 下配置vpn服务器(pptp)
一.安装所需的软件包: pptpd-*.rpm ppp-*.rpm pptp-*.rpm 一般情况下系统已经将pptp和ppp包安装好了,所以只需安装pptpd ...
- Effective C++ -----条款16:成对使用new和delete时要采取相同形式
如果你在new表达式中使用[],必须在相应的delete表达式中也使用[].如果你在new表达式中不使用[],一定不要在相应的delete表达式中使用[].
- Divide and conquer:Dropping tests(POJ 2976)
最大化平均值 题目大意:给定你n个分数,从中找出k个数,使∑a/∑b的最大值 这一题同样的也可以用二分法来做(用DP会超时,可见二分法是多么的实用呵!),大体上是这样子:假设最大的平均值是w,那么题目 ...
- Solr安装过程
Solr安装过程 下载相关资料 solr 4.2.0 http://lucene.apache.org/solr/ 期间安装过 solr 4.3.0 很可惜没有配置成功 apache-tomcat-7 ...
- assign() 方法
assign() 方法可加载一个新的文档. 语法 location.assign(URL) <html> <head> <script type="text/j ...
- 【python】入门学习(十)
#入门学习系列的内容均是在学习<Python编程入门(第3版)>时的学习笔记 统计一个文本文档的信息,并输出出现频率最高的10个单词 #text.py #保留的字符 keep = {'a' ...
- SQL Server output经典使用
output经典使用 分类: sql2012-02-16 18:17 409人阅读 评论(0) 收藏 举报 outputinserttabledeletegonull OUTPUT是SQL SERVE ...
- flume学习
下载 自定义sink(mysql) 1.ide打开下载后的源码 2.代码如下: /** * Licensed to the Apache Software Foundation (ASF) under ...