题目链接:
https://leetcode.com/problems/split-array-largest-sum/?tab=Description
题目:
代码:
#include <iostream>
#include<cstdio>
#include<vector>
#define maxn 1005
using namespace std;
vector<int >aa;
using namespace std;
bool guess(long long mid ,vector<int>& nums,int m)
{
long long sum=0;
for(int i=0;i<nums.size();i++)
{
if(sum+nums[i]>mid)
{
m--;
sum=nums[i];
if(nums[i]>mid)
return false;
}
else
sum+=nums[i];
}
return m>=1;
}
///返回值是 long long 型
long long splitArray(vector<int>& nums, int m)
{
///在这里要非常注意R(右边界)的初值是1而不是0
long long R=1,L=0,ans=0;
for(int i=0;i<nums.size();i++)
R+=(long long)nums[i];
while(L<R)
{
///
long long mid=(L+R)/2;
if(guess(mid,nums,m))
{
///
ans=mid;
R=mid;
}
else
{
///
L=mid+1;
}
}
return ans;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)==2)
{
int a;
for(int i=0;i<n;i++)
{
scanf("%d",&a);
///vector向量向尾部添加元素
aa.push_back(a);
}
// printf("%lld\n",splitArray(aa,m));
///用cout输出数据不需要指明数据的格式以及位数,比较方便
cout<<splitArray(aa,m)<<endl;
}
return 0;
}
注解:
1、二分法的精髓是:函数单调性(正相关或者负相关)+计算内容的重复;
2、猜答案——>判定,模板基本如上所示;
3、谨防使用二分法犯的错误:左闭右开、已经计算过的值不重复参与计算。