關於二分法左右端點的可能出現的問題。
最好根據題目設定左右端點的值,而不是直接使用0至資料範圍最大值,否則可能出現問題。
例題**於洛谷:p1182 數列分段 section ii 題目鏈結
**如下:
#include
using
namespace std;
typedef
unsigned
long
long ll;
const
int maxv=
100100
;const
int mod=
100000
;int a[maxv]
;bool
judge
(int val,
int n,
int m)
len+
=a[i];}
if(len) num++
;return num<=m;
}int
binarysearch
(int left,
int right,
int m,
int n)
return left;
}int
main()
printf
("%d"
,binarysearch
(left,right,m,n));
return0;
}
很明顯,左端點應該設定成每個數列的最大值,而不能直接用1或者0。比如n=5,m=5,a[5]=就會出現1或0的值符合要求的情況,實際上該值根本無法將數列分割,故無法達到要求。
分析如上,歡迎討論。
可能的二分法
給定一組 n 人 編號為 1,2,n 我們想把每個人分進任意大小的兩組。每個人都可能不喜歡其他人,那麼他們不應該屬於同一組。形式上,如果 dislikes i a,b 表示不允許將編號為 a 和 b 的人歸入同一組。當可以用這種方法將所有人分進兩組時,返回 true 否則返回 false。示例 1 ...
886 可能的二分法
題目描述 示例 1 輸入 n 4,dislikes 1,2 1,3 2,4 輸出 true 解釋 group1 1,4 group2 2,3 示例 2 輸入 n 3,dislikes 1,2 1,3 2,3 輸出 false 示例 3 輸入 n 5,dislikes 1,2 2,3 3,4 4,5 ...
886 可能的二分法
給定一組 n 人 編號為 1,2,n 我們想把每個人分進任意大小的兩組。每個人都可能不喜歡其他人,那麼他們不應該屬於同一組。形式上,如果 dislikes i a,b 表示不允許將編號為 a 和 b 的人歸入同一組。當可以用這種方法將所有人分進兩組時,返回 true 否則返回 false。impor...