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: 根节点 ...
随机推荐
- poj1155
题意:给定一个树形图,节点数量3000.叶子节点是用户,每个用户如果能看上电视会交一定的电视费.看上电视的条件是从根到该用户的路径全部被修好,修每条边有一个费用.在不亏损(用户交钱总额>=修路总 ...
- Unity3d NavMesh获得地面高度
UnityPro内置的NavMesh有几个API很有用 NavMesh.SamplePosition 根据给的点进行采样,可传入最大距离,返回true说明采样到了点,否则采样失败(可以用来获得地形高度 ...
- js中apply方法的使用
js中apply方法的使用 1.对象的继承,一般的做法是复制:Object.extend prototype.js的实现方式是: Object.extend = function(destinat ...
- js事件监听器用法实例详解
这篇文章主要介绍了js事件监听器用法,以实例形式较为详细的分析了javascript事件监听器使用注意事项与相关技巧,需要的朋友可以参考下本文实例讲述了js事件监听器用法.分享给大家供大家参考.具体分 ...
- 获取指定文件下的所有file文件
/** * 描述:获取所有的文件列表 * @param file * @param list * @return */ private List<File> getAllFiles(Fil ...
- 打开VS2012的创建单元测试功能
在VS2010中,在类中点击右键,有一个创建创建单元测试命令,可以很方便的生成单元测试项目和代码.但不知道为什么VS2012反而没有这个功能. 网上搜了一下,好在这个功能是可以通过配置打来的. 传送门 ...
- 监控Tomcat解决方案(监控应用服务器系列文章分享)
使用JMX接口开发监控程序 ◆ 全部代码需要从零开始,代码量较大 ◆ 支持各不同版本比较麻烦,每个版本可能有差异 ◆ 可支配性强 ◆ 最重要的一个缺点是,配置比较麻烦 Tomcat激活JMX远 ...
- Android屏幕适配dp、px两套解决办法
"又是屏幕适配,这类文章网上不是很多了吗?" 我也很遗憾,确实又是老问题.但本文重点对网上的各种方案做一个简短的总结,和具体使用方法. 若想了解具体Android设备适配的前世因果 ...
- xmpp即时通讯的笔记(摘抄)
xmpp的使用: 即时通讯 instant messaging(IM) : -->实时收发信息! 即时通讯相关软件: **QQ,MSN,GoogleTalk,AIM,Jabber(XMPP别名 ...
- [Android Pro] Android API 23中废弃了HttpClient的解决办法
reference to : http://blog.csdn.net/hbwindy/article/details/51326019 reference to : http://blog.csdn ...