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...