今天講的是二分答案
二分答案實際上是二分猜答案(好多題差不多,水題可以複製**ac )
首先我們來看一下目錄吧
二分答案講解
最大值最小問題
2.1 luogu p1824 進擊的奶牛
2.2 luogu p1182 數列分段 section ii
最小值最大問題
3.1 luogu p1873 砍樹
其他4.1 p2440 木材加工
判斷這個題是否用到二分這種思想
寫判斷函式
寫二分部分
3.1 板子1——最小值最大
3.2 板子2——最大值最小
分析問題,確定左右半段哪個是符合題意的區間,以及mid歸屬於哪一段
分析結果,選擇兩種板子
mid =
(l + r)/2
; r = mid, l = mid +1;
//板子1
mid =
( l + r +1)
/2; l = mid; r = mid -1;
//板子2
判斷mid的演算法要不要加1!! 判斷錯誤就會出現死迴圈;
(建議此步驟在草圖畫兩個小圈圈代表最後兩個數,把表示式帶進去驗證,就可以知道是要不要加1了 )
二分終止條件是l == r;
也是答案所在的位置
所以我們究竟如何去二分答案呢?
請大家按照1.1 二分答案的步驟執行
ac**如下
#include
#include
#include
using
namespace std;
int a[
100005];
int n,c;
intjud
(int x)
}return sum;
}int
main()
printf
("%d"
,r);
return0;
}
我是不會告訴你這個題和openjudge 一樣一樣的
openjudge 二分查詢06:月度開銷
//最大值最小
using
namespace std;
int a[
100005];
int n,c,mx,tot;
intjud
(int x)
else sum+
=a[i];}
return cnt;
}int
main()
int l = mx,r = tot;
while
(l < r)
printf
("%d"
,l);
return0;
}乙個long long 引發的**
因為資料範圍過大,所以要用long long !!!
本蒟蒻多次70分後一氣之下全部換成了long long
#include
#include
#include
#define ll long long
using
namespace std;
ll a[
1000005];
ll n,c,mx;
ll jud
(ll x)
return sum;
}int
main()
// printf("%d\n",jud(mx));
ll l =
0,r = mx;
while
(l < r)
printf
("%lld"
,l);
return0;
}
這個題需要注意一下二分部分的寫法
各位大佬有更標準的解法告訴偶一下哦
#include
#define ll long long
using
namespace std;
int a[
100005
],n,c;
intjud
(ll x)
intmain()
int l =
0, r =
210000000
;while
(l < r-1)
printf
("%d"
,l);
return0;
}
筆記 二分答案
二分答案 o nlogm 對一段有序的序列 每次二分,從而快速的查詢。解決的問題常是 使最大值最小 或 使最小值最大 注意 注意二分的序列是有序的,對於無序的序列進行二分需要先排序。二分的區間盡可能大 給定區間左右端點 1 根據題目要求,設定好check函式。防止死迴圈。模板 1 第一種 2whil...
二分查詢與二分答案
主要用於在乙個單調的函式中查詢某值 連續函式的情況 若當前查詢的區間是 l,r 查詢的值是 y 函式單增 設 mid l r 2 若 f mid y 則 l mid,否則 r mid 直至 r l eps 當前查詢的區間是 l,r 查詢的值是 y 函式單增 設 mid l r 2 若 f mid y...
二分查詢和二分答案
1.解釋 優點 查詢速度快。缺點 待查表為有序表。4.時間複雜度 o log n 5.示例 p2249查詢 include include using namespace std long long n,m,a 1000005 b 100005 l,r,mid,cnt,x intmain for i...