暴力高階,有序二分暴力

2021-07-30 05:18:16 字數 1305 閱讀 1317

//#include#include#includeusing namespace std;

typedef long long ll;

const int n=1e5;

int a[n+100];

int f(int mid,int n)

}//printf("mid=%d num=%d\n",mid,num);

return num;

}int main()

//printf("%d %d\n",l,r);

while(l<=r)

printf("%d\n",mid); //感覺有bug資料

}return 0;

}

有n個花費,現在要分成m段。使得每一段的和最小的那個值是所有分法裡最大的。 (引用他人·的,額,有了解題思路)

題解:求最大化最小值或者最小化最大值的問題可以用二分法來做。為什麼用二分? 

以求最大化最小值問題為例。 

我們知道二分有乙個前提就是對有序的東西才能二分查詢。也就是這個問題變數是有序的才能用二分。 

在求最大化最小值時,既然求值,那麼這個值一定有乙個範圍。而求最大化最小值時。既然它可以「最大化」,那我們一般可以推到乙個」最大值「。既然它可以「最小值」,那我們一般可以推到乙個」最小值「。可知最終的這個「值」一定在這個最大值與最小值之間的範圍裡。當我們在這個範圍裡挑乙個值得時候。我們經過處理,得出乙個和題目要求位置相同的變數。我們挑的這個值確定的這個變數狀態與題目的要求變數進行比較。這個就是有序的。在本題中就是,但我列舉乙個總和k後,求得在這個中和下的最大分段數,這個分段數與題目要求的分m段的比較是有序的。如果比m大,說明段數分多了–>說明k列舉小了,接下來再在大於k的區間列舉。這就可以二分了。

再就是唯一性問題。 

一般而言最大化最小值問題都會只有乙個確定的答案(如果有多個答案,也應該都是一樣的值)這是顯然的。那麼在二分過程中我們應該是不斷縮小[l,r]的範圍,最終使得l==r才退出二分。這樣才是乙個唯一的結果。如果當我們過程中查到了某個值的狀態滿足題目要求就退出。我們就無法保證這是唯一的那個答案。

monthly expense

#include//轉化下:合併連續段(n->m)找所有方法中的最小值。

#include#include#includeusing namespace std;

const int n=50000;

int jud(int x,int n,int *a)

{ int s=0,num=0;

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

{if(a[i]+sriver hopscotch

暴力 二分答案 JZOJ 蛋糕

有乙個n m n mn m的蛋糕 有數字 橫著切三刀在豎著切三刀分成16份使最小的最大。首先 最小的最大 確定了這題可以二分答案 這題我們先暴枚豎切三刀,再二分判定 include include include using namespace std int n,m,rr,ans,l,r int ...

LCP 08 暴力 二分

題意 傳送門 lcp 08 題解暴力 觸發條件要求 c c i c c i c c i 且 r r i r r i r r i 且 h h i h h i h h i 則分別處理 c,r h c,r,h c,r,h,對其排序後求各個場景的最小觸發時間,在 3 33 個屬性都滿足觸發的條件下,取最大值...

LeeCode 1439 暴力 二分

題意 傳送門 1439.有序矩陣中的第 k 個最小陣列和 題解暴力 列舉所有陣列 o n m o n m o nm 考慮到 k kk 值較小,每一次列舉當前行,將子陣列和大小壓縮為 min k,t mp.s ize min k,tmp.size min k,tmp.size 只保留最小的 k kk ...