抽签问题
方案1:暴力法( O ( n 4 O(n^{4} O(n4)复杂度)
上面是一层有一层循环,嵌套了4层for循环,复杂度是
O
(
n
4
)
O(n^{4})
O(n4).
方案2:二分查找初步优化( O ( n 3 l o g n O(n^{3}logn O(n3logn)复杂度)
在最里面一层for循环,加一个二分查找做判断可以降低时间复杂度。
方案3:枚举循环二分查找( O ( n 2 l o g n O(n^{2}logn O(n2logn)复杂度)
具体代码如下所示:
void slove(){
for(int c=0;c<n;c++) //枚举Kc+Kd的和,并排序
for(int d=0;d<n;d++)
kk[c*n+d] = Kc + Kd;
sort(kk,kk+n*n);
bool f = false;
for(int a=0;a<n;a++)
for(int b=0;b<n;b++)
if(binary_search(m-k[a]-k[b])
f = true;
}