二分(三分)+快速幂

之前学习的二分,现在感觉突然理解许多,补一下总结
首先,二分能够解决什么样的问题呢,个人认为,二分能够快速解决已经知道答案范围(线性)但是不知道确切答案的问题,例如在一个有序序列中查找某一元素出现的(最早,最晚)位置,求某单调(或在给定区间上单调)函数的零点,最大化最小值或者最小化最大值等等
二分的模板大体如下:

int l=x;//x表示元素可能出现的最小(最左边)的情况
int r=y;//y表示元素可能出现的最大(最右边)的情况
int ans,mid;
while(i<=l)
{mid=(l+r)/2;  //二分if(check(mid))//判断中点的情况{l=mid+1;ans=mid;  //或者ans=max(ans,mid)等,ans用于保存答案,如果需要所有可行答案中的最大值或者最小值加上max或者min即可}else{r=mid-1;}
}

总体来讲二分的思想还是比较简单的,但是问题的难点经常不是考虑不到二分,而是考虑到二分却不知道如何判断要查找的元素在mid的情况下能否可行,即如何编写check(mid)函数。这个函数的编写往往要仔细考虑要查找元素的特征(以及脑洞)。
比如经常出现的最大化最小值和最小化最大值等,那些放牛的等问题判断起来还是比较容易的,就从开始一个一个按照条件放,如果能行就能行。但是更多的问题还是比较灵活的,比如POJ - 3104

题意大概是一个人冬天洗衣服想要让衣服尽快的干问最少需要多少时间。
这个我们很容易确定所花最长时间是水分最多的衣服所含有的水分(不用那个烘干器自然风干),最短时间为0,但是给定一个时间,我们怎么判断这个时间内可不可以将衣服晾干呢?
这就需要我们进行一个转换,我们不妨这样想:这些衣服先晾了mid分钟,然后再将还没有干的全部用烘干器烘干,烘干器只能烘mid次,每次烘干k-1的水分。
乍看好像有些无厘头,其实仔细一想很简单,我们只不过把原来一起做的事情拆开来分析而已(表示不好想到)。
这样的话我们遍历每件衣服,如果它没有自己晾干就得用烘干器,如果在mid次以内全部烘干了就可以,如果没有就不行。
需要注意一点的是如果原本烘干器是个假的烘干器(每分钟烘干的速度和晾衣服的速度一样),那么只处理晾后的,就不要用烘干器再处理了(烘干器每次处理0,不注意这点的话可能会re,我re了好多次才注意到)。

附AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;int n,k;
int a[100100];bool cmp(int a,int b)
{return a>b;
}
bool check(int time)
{int tmp=time;int t;for(int i=0;i<n;i++){t=a[i]-time;if(t>0){if(k==0)return false;tmp-=t/k;if(t%k!=0)tmp--;}if(tmp<0)return false;}return true;
}
int main()
{int tmp;memset(a,0,sizeof(a));scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&a[i]);}scanf("%d",&k);k--;sort(a,a+n,cmp);int l=0,r=a[0];int ans=0,mid;while(l<=r){mid=(l+r)/2;if(check(mid)){r=mid-1;ans=mid;}else{l=mid+1;}}printf("%d",ans);return 0;
}

除此之外二分法快速幂也经常使用,必须熟记(虽然我觉得是一个递归)
快速幂板子(非递归写法):

long long qucik_pow(long long a,long long n,long long m)//求a^n%m
{long long ans=1;while(n){if(n&1)	ans=(ans*a)%m;a=a*a%m;n>>=1;}return ans%m;
}

还有递归写法(有助于理解快速幂,但是不常用)

long long quick_pow(long long a,long long n,long long m)
{if(n==1) return a;if(n%2==0){long long t=quick_pow(a,n/2,m);return t*t%m;}else{long long t=quick_pow(a,b/2,m);t=t*t%m;t=t*a%m;return t;}
}

三分的话每太用过,只是见过用来求凸凹函数的极值点
思想就是先将区间二分,在将其中一个区间二分,然后比较两个点的大小,哪个距离极值点远就将哪一边更新,应该是可以根据凹凸函数的性质进行证明的(我比较懒就不证明了,有时间再证吧),附一下板子:

while(left+eps<right)
{midl=(left+right)/2;midr=(midl+right)/2;if(f(midl)<f(midr)){right=midr;}else{left=midl;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384223.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pthread_cleanup_push与pthread_cleanup_pop的目的 作用

http://blog.csdn.net/slj_win/article/details/7267483 首先你必须知道pthread_cleanup_push与pthread_cleanup_pop的目的(作用)是什么。 比如thread1: 执行 pthread_mutex_lock(&mutex); //一些会阻塞程序运行的调用&#xff0c;比如套接字的accept&#xff0c;等待客…

动态规划浅谈

接触动态规划这么久了&#xff0c;简单谈一下自己对动态规划的理解。 动态规划名字听起来好像比比较高大上&#xff0c;可是事实上&#xff0c;人家就是比较高大上。&#xff08;抖个机灵&#xff09; 刚开始接触动态规划的时候觉得好可怕&#xff0c;这么复杂的问题我怎么能想…

Linux多线程——使用信号量同步线程

http://blog.csdn.net/ljianhui/article/details/10813469/ 信号量、同步这些名词在进程间通信时就已经说过&#xff0c;在这里它们的意思是相同的&#xff0c;只不过是同步的对象不同而已。但是下面介绍的信号量的接口是用于线程的信号量&#xff0c;注意不要跟用于进程间通信…

linux下安装erlang

1.安装Erlang编译依赖: yum -y install gcc glibc-devel make ncurses-devel openssl-devel xmlto perl wget 2.下载Erlang&#xff1a; wget http://www.erlang.org/download/otp_src_19.3.tar.gz 3.解压并安装 tar -xzvf otp_src_19.3.tar.gz cd otp_src_19.3 ./configure --…

Linux 线程同步的三种方法

http://blog.csdn.net/zsf8701/article/details/7844316 线程的最大特点是资源的共享性&#xff0c;但资源共享中的同步问题是多线程编程的难点。linux下提供了多种方式来处理线程同步&#xff0c;最常用的是互斥锁、条件变量和信号量。 一、互斥锁(mutex) 通过锁机制实现线程…

Elixir特性

iex 退出&#xff1a;Ctrl-C 或Ctrl-G再输入q 回车。 帮助文档&#xff1a;h 查看辅函数列表 h IO 查看IO模块帮助 h IO.puts 查看IO模块中的puts函数的文档 编译和运行&#xff1a;创建一个hello.exs的文件。IO.puts "hello world"    //输出hello world 使用el…

Elixir基础

值类型 整数&#xff0c;包括十进制&#xff08;1234&#xff09;、十六进制&#xff08;0xcafe&#xff09;、八进制&#xff08;0o765&#xff09;和二进制&#xff08;0b1010&#xff09; 浮点数 原子&#xff0c;原子是常量&#xff0c;用于表现某些东西的名字&#xff0c;…

C++11新特性之八——函数对象function

http://www.cnblogs.com/yyxt/p/3987717.html 详细请看《C Primer plus》(第六版中文版) http://www.cnblogs.com/lvpengms/archive/2011/02/21/1960078.html 备注&#xff1a; 函数对象&#xff1a; 尽管函数指针被广泛用于实现函数回调&#xff0c;但C还提供了一个重要的实现…

分块思想

今天学习了一个算法&#xff08;这个应该叫做算法吧&#xff1f;&#xff09;叫做分块&#xff08;和莫队&#xff0c;但是莫队还没有搞懂&#xff0c;搞懂再来写吧&#xff09; 听起来很高级&#xff0c;蒟蒻表示瑟瑟发抖。但是学完发现怎么那么像是一种变相的暴力呢。 分块思…

从零开始学C++之STL(八):函数对象、 函数对象与容器、函数对象与算法

http://blog.csdn.net/jnu_simba/article/details/9500219 一、函数对象 1、函数对象&#xff08;function object&#xff09;也称为仿函数&#xff08;functor&#xff09; 2、一个行为类似函数的对象&#xff0c;它可以没有参数&#xff0c;也可以带有若干参数。 3、任何重载…

树状数组初步理解

学习树状数组已经两周了&#xff0c;之前偷懒一直没有写&#xff0c;赶紧补上防止自己忘记&#xff08;虽然好像已经忘得差不多了&#xff09;。 作为一种经常处理区间问题的数据结构&#xff0c;它和线段树、分块一样&#xff0c;核心就是将区间分成许多个小区间然后通过对大区…

命名函数

函数体是代码块 代码块do...end是一种表达式的组织方式。 # ./times.exs下defmodule Times dodef doule(n) don * 2end end 函数调用与模式匹配 代码如下&#xff1a; # ./factorial.exs    计算阶层 defmodule Factorial dodef of(0), do: 1          #终止条件…

STL运用的C++技术(6)——函数对象

http://blog.csdn.net/wuzhekai1985/article/details/6658940?_t_t_t0.20427969420870595 STL是C标准库的重要组成部分之一&#xff0c;它不仅是一个可复用的组件库&#xff0c;更是一个包含算法与数据结构的软件框架&#xff0c;同时也是C泛型编程的很好例子。STL中运用了许多…

列表与递归

头部和尾部 [head | tail ] [1] #head 1 tail [] [head | tail ] [1, 2, 3] #head 1 tail [2, 3] [head | tail ] [] #报错 创建映射函数 我们可以使用一个函数来处理列表中的各个元素&#xff0c;如此可以接受更加复杂的处理&#xff0c;也可以…

优先队列小结

不像栈和队列&#xff0c;虽然STL有较好实现但是我们自己也可以很方便的实现&#xff0c;优先队列自己实现起来就比较复杂&#xff0c;比较浪费时间&#xff08;而且自己目前也不会233&#xff09;而优先队列因为其较好的特性经常被使用&#xff0c;因此对它的熟练掌握是做题的…

字典:散列表、散列字典、关键字列表、集合与结构体

字典 散列表和散列字典都实现了Dict的行为。Keyword模块也基本实现了&#xff0c;不同之处在于它支持重复键。 Eunm.into可以将一种类型的收集映射转化成另一种。 defmodule Sum dodef values(dict) dodict |> Dict.values |> Enum.sumend endhd [ one: 1, two: 2, thre…

C++11 学习笔记 lambda表达式

http://blog.csdn.net/fjzpdkf/article/details/50249287 lambda表达式是C11最重要也最常用的一个特性之一。lambda来源于函数式编程的概念&#xff0c;也是现代编程语言的一个特点。 一.函数式编程简介 定义&#xff1a;简单说&#xff0c;“函数式编程”是一种“编程范式”。…

Cutting Codeforces Round #493 (Div. 2)

Cutting There are a lot of things which could be cut — trees, paper, “the rope”. In this problem you are going to cut a sequence of integers. There is a sequence of integers, which contains the equal number of even and odd numbers. Given a limited bud…

Enum、Stream

Enum 其常见用法见&#xff1a;https://cloud.tencent.com/developer/section/1116852 在sort时&#xff0c;如果要获得稳定的排序结果&#xff0c;要使用< 而不是 <。 Stream Stream是延迟处理的&#xff0c;而Enum是贪婪的&#xff0c;则意味着传给它一个收集&#xff…

linux网络编程之posix 线程(三):posix 匿名信号量与互斥锁 示例生产者--消费者问题

http://blog.csdn.net/jnu_simba/article/details/9123603 一、posix 信号量 信号量的概念参见这里。前面也讲过system v 信号量&#xff0c;现在来说说posix 信号量。 system v 信号量只能用于进程间同步&#xff0c;而posix 信号量除了可以进程间同步&#xff0c;还可以线程间…