题目链接: 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、谨防使用二分法犯的错误:左闭右开、已经计算过的值不重复参与计算。