飞机票
题意:
思路:
二分答案经典题,把每段和最大值的最小枚举出来用二分去找最小且可以分的段数不超过m的。
补充一下二分答案,名如其人 ,二分的方法枚举答案,并且枚举时判断这个答案是否可行。但是,二分并不是在所有情况下都是可用的,使用二分需要满足两个条件:
1.有上下界
2.区间有单调性
二分答案应该是在一个单调闭区间上进行的。也就是说,二分答案最后得到的答案应该是一个确定值,而不是像搜索那样会出现多解。二分一般用来解决最优解问题。
#include<bits/stdc++.> using namespace std; const int maxn=1e5+100; int a[maxn]; int sum[maxn]; int main() { int n,m,i,j,ans=0,max1=0; cin>>n>>m; for(i=1;i<=n;i++){ cin>>a[i]; sum[i]+=(sum[i-1]+a[i]); max1=max(max1,a[i]); ans+=a[i]; } int l=max1,r=ans,mid,anss=0x3f3f3f3f; while(l<=r){ mid=(l+r)/2; int cnt=0,sum1=0; for(i=1;i<=n;i++){ sum1+=a[i]; if(sum1>mid) { sum1=a[i],cnt++; } } if(sum1>mid) { cnt++; }cnt++; if(cnt>m){ l=mid+1; } else { anss=min(mid,anss); r=mid-1; } } cout<<anss<<endl; return 0; }