题目:
分析:
二分,显然是枚举结果。
关键是如何判断重量是否满足条件。
还好是按顺序的,否则还要dp。
细细的分析:
while(b<e)
{
int c=b+(e-b)/2;
//天数 小于等于
if(f(w,c)<=d) b=c+1;
else e=c-1;
}
1.b可能在答案的右边,之后一直是e=c-1,最终b=答案+1,e=答案。
2.e可能在答案的左边,之后一直是b=c+1,最终b=e=答案-1。
3.e是答案,则最终e=b=答案。
4.b是答案,最终e=答案-1,b=答案。
5.b和e中间是答案,则应该取e,b最终b=e=答案。
所以答案在e,e+1中选。
代码:
int f(vector<int> w,int n)
{
int all=0;
int m=0;//天数
for(int i=0;i<w.size();i++)
{
cout<<all<<"----"<<endl;
if(w[i]>n) return 1<<30;
if(all+w[i]>n)
{
m++;
all=0;
}
all+=w[i];
}
m++;
return m;
}
int main()
{
vector<int> w;
int d;
int b=0;
int e=0;
for(int i=0;i<w.size();i++)
{
e+=w[i];
b=max(b,w[i]);
}
while(b<e)
{
cout<<b<<" "<<e<<" "<<f(w,b+(e-b)/2)<<endl;
int c=b+(e-b)/2;
//天数 小于等于
if(f(w,c)<=d) e=c-1;
else b=c+1;
cout<<b<<" "<<e<<" "<<f(w,b+(e-b)/2)<<endl<<" "<<endl;
}
cout<<" --------- "<<endl;
if(f(w,e)<=d) cout<<e;
else cout<<e+1;
}