• 09:LGTB 学分块


    总时间限制: 
    10000ms
     
    单个测试点时间限制: 
    1000ms
     
    内存限制: 
    65536kB
    描述

    LGTB 最近在学分块,但是他太菜了,分的块数量太多他就混乱了,所以只能分成 3 块

    今天他得到了一个数组,他突然也想把它分块,他想知道,把这个数组分成 3 块,块可以为空。假设 3 块各自的和中的最大值最小

    请输出分完之后 3 块中的最大值

    输入
    输入第一行包含一个整数 n 代表数组大小
    接下来 n 个整数 a1 , a2 , ..., a n ,代表数组
    输出
    输出包含 1 个整数,代表分块完成后 3 块中的最大值
    样例输入
    10
    2 5 1 4 7 3 6 2 5 1
    
    样例输出
    14
    提示
    对于 40% 的数据,1 ≤ n ≤ 10
    对于 70% 的数据,1 ≤ n ≤ 1e3
    对于 100% 的数据,1 ≤ n ≤ 1e5 , 1 ≤ ai ≤ 1e7
    【思路】二分答案 加long long多30分,修改左端点+10分,一开始我的左端点是0.全场第一个AC热烈鼓掌啊哈哈哈。
    【code】
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    #define Max 100009
    long long a[Max];
    long long tot,n,mid,l,r,ans;
    long long Minn=2147483647;
    bool check(long long x)
    {
        long long cnt=1,totscor=0;
        for(int i=1;i<=n;i++)
        {
            totscor+=a[i];
            if(totscor>x)
            {
                totscor=a[i];
                cnt++;
                if(cnt>3)
                {
                    return 0;
                }
            }
        }
        return 1;
    }
    int main()
    {
        scanf("%lld",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%lld",&a[i]);
            Minn=min(a[i],Minn);
            tot+=a[i];
        }
        l=Minn;r=tot;
        while(l<=r)
        {
            mid=(l+r)>>1;
            if(check(mid))ans=mid,r=mid-1;
            else l=mid+1;
        }
        printf("%lld",ans);
        return 0;
    }
  • 相关阅读:
    sqlserver2005转换到2000
    vs2008的注册
    给联想K46装系统
    两个调片技巧
    mapx集合的问题
    audio player播放多文件
    JQuery查询ul嵌套结构中当前所处的位置
    .Net中使用带UI的OCX的方法
    U盘启动和量产
    winrar的图标
  • 原文地址:https://www.cnblogs.com/zzyh/p/7191397.html
Copyright © 2020-2023  润新知