• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

yongchaoD

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

A. 这个数组不想被划分(二分答案,大一期末考核)

题目来源:https://codeforces.com/gym/547381/problem/A
//
题意:给定n长的数字串,然后分为k个子数组(连续的),怎么分(每个元素都要被分),每个子序列的和的最大值最小。
//
思路:“赛时没有想出来,很典的一道二分答案”,二分最优答案,check是枚举数组,贪心分子序列,保证每个子序列都<=mid。
//
代码:

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+9;
int n,k;
vector<int>a(N);

int check(int x){//枚举a,每个子区间的和控制在<=k
    int ans=0,sum=0;
    for(int i=1;i<=n;i++){
        if(a[i]>x){return 0;}//一个区间都包含不了
        if(sum+a[i]<=x){
            sum+=a[i];
        }
        else{
            ans++;
            sum=a[i];
        }
    }
    if(sum!=0){ans++;}
    if(ans<=k){return 1;}
    else{return 0;}
}

signed main()
{
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }

    int l=1,r=5e15+9,ans;
    while(l<=r){
        int mid=(l+r)>>1;
        if(check(mid)){//mid够,找更小的优
            ans=mid;
            r=mid-1;
        }
        else{
           l=mid+1;
        }
    }
    cout<<ans<<endl;
    return 0;
}

posted on 2024-09-18 17:26  yongchaoD  阅读(18)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3