刷題 二分搜尋 (1)

2022-08-13 22:48:17 字數 3346 閱讀 1658

模板

找出最左邊的乙個,最右邊的乙個,和長度

注意找左位置時要判斷:

1>不可以是字串結尾,不然為0或為空

2>不可以不等於key

#include#include

#include

using

namespace

std;

intn,m;

const

int n=100003

;int

d[n];

intmain()

int pos2=upper_bound(d+pos1+1,d+n+1,x)-d;

printf(

"%d %d %d\n

",pos1,pos2-1,pos2-pos1);

}return0;

}

例題1阿彌陀佛數數遊戲

n個數字(n<=500000),k(k<=500000)個問題,

每個問題詢問從l到r中,到底有多少個數字是key值?

資料都是int可以儲存的

神仙思路:

題目雖然有兩個關鍵字,但是只求第乙個關鍵字相等的情況,所以可以直接sort

sort以後找到相等區間,再去搞第二關鍵字就好

#include#include

#include

using

namespace

std;

intn,k;

const

int n=500003

;struct

node

}d[n];

intmain()

}return0;

}

例題2曬衣服

1>貪心

眾所周知,堆比sort快(除了我)

#include#include

#include

using

namespace

std;

priority_queue q;

intn,a,b;

intmain()

printf(

"%d\n

",t);

return0;

}

2>二分搜尋答案

二分快速確認答案範圍

#include#include

#include

#include

using

namespace

std;

intn,a,b;

const

int n=500000

;int d[n+3

];bool check(int

tm)

return

true;}

intmain()

printf(

"%d\n

",l);

return0;

}

例題3穿越七彩虹

小數的二分

#include#include

#include

#include

using

namespace

std;

double

h,ed;

double x[10],r[10

];struct

node

}d[10];

bool check(double

ch) sort(d+1,d+8

);

double rr=d[1

].r ;

if(d[1].l >0) return

false

;

for(int i=2;i<=7;i++)

return rr>=ed;

}int

main()

printf(

"%.2lf

",l);//四捨五入輸出兩位小數

return0;

}

例題4矩形分割

平面上有乙個大矩形,其左下角座標(0,0),右上角座標(r,r)。大矩形內部包含一些小矩形,小矩形都平行於座標軸且互不重疊。所有矩形的頂點都是整點。要求畫一根平行於y軸的直線x=k(k是整數) ,使得這些小矩形落在直線左邊的面積必須大於等於落在右邊的面積,且兩邊面積之差最小。並且,要使得大矩形在直線左邊的的面積盡可能大。注意:若直線穿過乙個小矩形,將會把它切成兩個部分,分屬左右兩側。

#include#include

#include

using

namespace

std;

intr,n;

const

int r=1000003;//

注意:我將面積落在偏右節點上

long

long cf[r],sum[r];//

cf是i項減去i-1項

//sum是前i項的面積之和 ,則sum的有效部分是[2,r],第一項面積為0

intmain()

long

long nw=0;//

差分序列前i項的和

for(int i=1;i<=r;i++)

long

long mid=sum[r]-(sum[r]>>1

);

int pos=lower_bound(sum,sum+r+1,mid)-sum;

while(pos1]) pos++;

int pos2=upper_bound(sum+1,sum+r+1,mid)-sum;

if(pos2 && sum[pos2-1]>=mid) pos2--; //

注意:這兩段其實是不一樣的,第二段中的sum[pos2]雖然一定大於了mid,是最小差值,但是不一定是最後乙個最小差值

//再加上乙個向後尋找就好了

printf("

%d\n

",pos);

return0;

}

例題5有道搜尋框

//

注意呀:字串可以都看作數

//只是比大小是左對齊形式罷了

#include#include

#include

#include

using

namespace

std;

intn,q;

const

int n=10003

;string

s[n],ask;

intpos;

intmain()

else

}

return

0;}

python刷題 二分查詢

def binarysearch nums,target left 0 right len nums 1 while left right mid right left 2 if nums mid target return true elif nums mid target left mid 1 ...

搜尋1 線性搜尋和二分搜尋

目錄 搜尋1線性搜尋 示例 二分搜尋 示例 總結搜尋 就是在資料集合中尋找給定的關鍵字的位置或判斷其有無。基本的搜尋演算法有如下三種,分別為線性搜尋,二分搜尋,雜湊法。下面我們先學習前兩者。線性搜尋就是從頭順次訪問各元素,檢查該元素是否與目標值相等。線性搜尋的演算法效率很低,但是用於各種形式的資料。...

LeetCode刷題總結 二分查詢

leetcode 刷題總結 二分查詢 二分主要是形成自己的 風格就可以了。常用兩種風格 現在偏向於風格一實現了 leetcode35.搜尋插入位置 給定乙個排序陣列和乙個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。這個實際上就是手動實現lower...