日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二分查找(2)

發(fā)布時(shí)間:2025/7/25 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二分查找(2) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
//poj 3273 Monthly Expense

/*
題意:給你天數(shù)n,和每天需要花的錢,讓你把這些天分成m份(每份都是連續(xù)的天),
要求每份的和盡量少,輸出這個(gè)和。

一開始二分的上界為n天花費(fèi)的總和(相當(dāng)于分成1份),下界為每天花費(fèi)的最大值(相當(dāng)于分成n份),
然后二分,每次的mid值為(上界 + 下界)/ 2,然后根據(jù)mid值遍歷n天花費(fèi),對花費(fèi)進(jìn)行累加,
每當(dāng)超過mid值 份數(shù)++,看看這個(gè)mid值能把n天分成幾份,如果份數(shù)大于m,表示mid偏小,下界 = mid + 1,
反之小于等于mid,上界 = mid,然后輸出最后的mid值即可,復(fù)雜度為 O(nlogM)
*/


#include
<iostream>
using namespace std;
int list[100010];
int main()
{
int n,m,i,max=0,sum=0;
cin
>>n>>m;
for(i=0;i<n;++i)
{
cin
>>list[i];
sum
+=list[i];
if(list[i]>max)
max
=list[i];
}
int low=max,high=sum,mid,s,t;
while(low<high)
{
mid
=(low+high)/2;
s
=0;t=0;
for(i=0;i<n;++i)
{
s
+=list[i];
if(s>mid)
{
t
++;
s
=list[i];
}
if(t>m)break;
}
if(s>0) //注意這句
t++;
if(t<=m)
//若t==m,此時(shí)不能斷定m是最小的,可能有比它更小的數(shù)也符合,具有單調(diào)性,所以需要繼續(xù)搜索前半部分
high=mid;
//這里不寫成high=mid+1;因?yàn)榭赡艹薽id符合外,并沒有比它小的數(shù)也符合
else
low
=mid+1;
//因?yàn)閘ow<=mid<high,所以high=mid,low=mid+1,都會(huì)不斷地縮小范圍,最終low==high,跳出循環(huán)
}
cout
<<low<<endl;
return 0;
}

//對應(yīng)于 0011序列中最左側(cè)的1的查找(最小值):
//http://duanple.blog.163.com/blog/static/709717672009049528185/

  

轉(zhuǎn)載于:https://www.cnblogs.com/mjc467621163/archive/2011/08/22/2149189.html

總結(jié)

以上是生活随笔為你收集整理的二分查找(2)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。