二分(三分)+快速冪

之前學習的二分,現在感覺突然理解許多,補一下總結
首先,二分能夠解決什么樣的問題呢,個人認為,二分能夠快速解決已經知道答案范圍(線性)但是不知道確切答案的問題,例如在一個有序序列中查找某一元素出現的(最早,最晚)位置,求某單調(或在給定區間上單調)函數的零點,最大化最小值或者最小化最大值等等
二分的模板大體如下:

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.pswp.cn/news/384223.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384223.shtml
英文地址,請注明出處:http://en.pswp.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;還可以線程間…