poj3273 poj3258 二分易錯點

2021-06-13 00:59:56 字數 1248 閱讀 6937

1.關於二分的兩種寫法

一種是 while(leftif()

left=mid+1;

else right=mid;

ans=left;

這是我比較喜歡的一種

還有一種是while(left<=right)

if()

left=mid+1;

else right=mid-1;

ans=mid;

注意兩種的ans是不同的

2. 假如二分要求的答案是個唯一確定的值,這樣是不容易錯的,但當有個區間是符合要求的,我們要求這個符合要求的區間的最大值或者最小值,這個時候就容易出錯了

而二分也經常用來求最大的最小值和最小的最大值

poj3258 二分求最大的最小值

不出錯關鍵要理解這個mid,此時我們要求這個可行區間的最大值,mid其實是小於這個上限但很接近它的乙個數,所以if(b[i]<=mid) 而不是<

二分統計後,if內的條件判斷不取等號是因為,這樣做後right會小於這個上限,使結果過小

#include #include #include #include #include #include using namespace std;

int a[50600],b[50600];

int main ()

sort(a+1,a+1+n);

a[++n]=l;

for(int i=n;i>=1;--i)

printf("%d\n",left);

} return 0;

}

poj 3273 二分求最小的最大值

此時我們要求這個可行區間的最小值,mid其實是大於這個下限但很接近它的乙個數,當mid符合要求時,即=m的時候

可以把right=mid,因為我們要求的是最小值

#include #include #include #include #include #include using namespace std;

int a[100600];

int main ()

else // 即if(now+a[i]<=mid)

}if(now)

cnt++;

if(cnt<=m)

right=mid;

else left=mid+1;

} printf("%d\n",left);

} return 0;

}

poj3273 poj3258 二分答案

二分答案的方法比較常用,思想比較簡單,就是從結果出發解決問題,已知答案在某乙個區間中,並且根據某種判定條件,能夠確定當前所選的值是大了還是小了,我們通過二分的方法將其找出來,從而降低時間複雜度。當然,這個判定條件就是二分答案的關鍵啦。通常,判定函式是乙個貪心演算法。二分答案的方法通常用來解決最小值最...

poj解題報告 3273

給出乙個大小為n的陣列,將其分為m塊,讓每塊數字之和的最大值盡量小。右邊界是將整個陣列當做一塊,那麼最大值就是所有數字之和 左邊界是將整個陣列分成n塊,那麼和的最大值就是陣列元素中的最大值。其實,當給出乙個答案後,從陣列首元素開始疊加,超出答案那麼分塊數加1,這麼遍歷一遍後,要是分塊數小於m,說明答...

poj解題報告 3258

題意 一些石頭排成一條線,第乙個和最後乙個不能去掉,其餘的共可以去掉m塊,要使去掉後石頭間距的最小值最大。這種數學題理解起來真不容易,不過想好了演算法就好做了。如下 include includeint a 50005 int b 50005 int cmp const void a,const v...