#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool IsValid(vector<int> vecdays,int M,int fajomax)
{
int cnt = 0, sum = 0;
for (int i = 0; i < vecdays.size(); i++)
{
if (sum + vecdays[i] > fajomax)
{
cnt++;
sum = vecdays[i];
}
else
sum += vecdays[i];
}
return cnt >= M;
//int sum=0,iret=0;
//for(int i=0;i<vecdays.size();i++)
//{
//if((sum+vecdays[i])<=fajomax)
//{
//sum+=vecdays[i];
//}
//else
//{
// iret++;
// sum=vecdays[i];
//}
//if(i==(vecdays.size()-1))
//{
// iret++;
// break;
//}
//}
//return iret>=M;
}
int main()
{
int N=0,M=0;
cin>>N>>M;
int icakenum=N;
vector<int> veccakev;
vector<int> veccakev2;
while((icakenum--)>0)
{
int r=0;
cin>>r;
veccakev.push_back(r);
veccakev2.push_back(r);
}
//二分法
int imin=0,imax=0;
for(int i=0;i<veccakev.size();i++)
{
imax+=veccakev[i];
}
//imin=imax/N;
sort(veccakev2.begin(),veccakev2.end());
imin=veccakev2[veccakev2.size()-1];
int ivalue=0;//(imax+imin)/2;
while((imax-imin)>=0)
{
ivalue=imin+(imax-imin)/2;
bool blret=IsValid(veccakev,M,ivalue);
if(blret)
{
imin=imin+(imax-imin)/2+1;
}
else
{
imax=imin+(imax-imin)/2-1;
}
//ivalue=(imax+imin)/2;
}
printf("%d\n",(imin));
return 0;
}
二分查找之月度开销
猜你喜欢
转载自blog.csdn.net/nanfeiyannan/article/details/104726401
今日推荐
周排行