day1 LGTB学分块

原题如下:

LGTB最近在学分块,但是他太菜了,分的块数量太多他就混乱了,所以只能分成3块
今天他得到了一个数组,他突然也想把它分块,他想知道,把这个数组分成3块,块可以为空。假设3块各
自的和中的最大值最小
请输出分完之后3 块中的最大值
输入
输入第一行包含一个整数n 代表数组大小
接下来n 个整数a1, a2, ..., an,代表数组
对于40% 的数据,1=<n<= 10
对于70% 的数据,1=<n<=103
对于100% 的数据,1=<n<=105, 1=<ai<=107
输出
输出包含1 个整数,代表分块完成后3 块中的最大值

这道题做的时候由于只想到暴力就没去写。。。正解的话相当于先用一指针i切成俩区间,之后再在另一较大区间里用二分,注意n=1与n=2时的特判。下面给出代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#ifdef WIN32
#define AUTO "%I64d"
#else
#define AUTO "%lld"
#endif
using namespace std;
long long n,a[100005],sum[100005],ans,t;
int main()
{
    freopen("divide.in","r",stdin);
    freopen("divide.out","w",stdout);
    cin>>n;
    for (int i=1;i<=n;i++)
    {
        scanf(AUTO,&a[i]);
        sum[i]=sum[i-1]+a[i];
    }
    long long res=111111111111ll;
    for (int i=1;i<=n;i++)
    {
        long long sum1=sum[i-1];
        int l=i+1,r=n+1;
        while(l<r-1)
        {
            int m=l+r>>1;
            if(sum[m-1]-sum1<=sum[n]-sum[m-1])
            l=m;
            else r=m;
        }
        long long sum2=sum[l-1]-sum1;
        long long sum3=sum[n]-sum[l-1];
        res=min(res,max(sum1,max(sum2,sum3)));
        sum2=sum[l]-sum1;
        sum3=sum[n]-sum[l];
        res=min(res,max(sum1,max(sum2,sum3)));
    }
    printf(AUTO,res);
    return 0;
}

清清正正射命丸文是也~

时间: 2024-10-02 14:18:36

day1 LGTB学分块的相关文章

09:LGTB 学分块

总时间限制:  10000ms 单个测试点时间限制:  1000ms 内存限制:  65536kB 描述 LGTB 最近在学分块,但是他太菜了,分的块数量太多他就混乱了,所以只能分成 3 块 今天他得到了一个数组,他突然也想把它分块,他想知道,把这个数组分成 3 块,块可以为空.假设 3 块各自的和中的最大值最小 请输出分完之后 3 块中的最大值 输入 输入第一行包含一个整数 n 代表数组大小接下来 n 个整数 a1 , a2 , ..., a n ,代表数组 输出 输出包含 1 个整数,代表分

day1 LGTB玩扫雷

先附上原题: 在一个n m 的棋盘上,有位置上有雷(用“*” 表示),其他位置是空地(用“.” 表示).LGTB 想在每个空地上写下它周围8 个方向相邻的格子中有几个雷.请帮助他输出写了之后的棋盘输入输入第一行包含两个整数n, m 代表棋盘大小接下来n 行,每行m 个字符,代表棋盘1 n,m 1000输出输出包含n 行,每行m 个字符,代表LGTB 写了数字之后的棋盘O(∩_∩)O哈!这道题,毫无算法可言就是了,纯暴力循环...那么,下面贴出代码: #include<cstdio> #incl

day1 LGTB玩THD

先贴出原题: LGTB 最近在玩一个类似DOTA 的游戏名叫THD有一天他在守一座塔,对面的N 个小兵排成一列从近到远站在塔前面每个小兵有一定的血量hi,杀死后有一定的金钱gi每一秒,他都可以攻击任意一个活着的小兵,对其造成P 点伤害,如果小兵的血量低于1 点,小兵死亡,他得到金钱.他也可以不攻击任何小兵.每一秒LGTB 攻击完毕之后,塔会攻击距离塔最近的一个活着的小兵,对其造成Q 点伤害,如果小兵的血量低于1 点,小兵死亡,LGTB 不会得到金钱现在LGTB 想知道,在他选择最优策略时,他能得

[无主题] 三题

1.LGTB 玩扫雷 题意 在一个n m 的棋盘上,有位置上有雷(用“*” 表示),其他位置是空地(用“.” 表示).LGTB 想在每个空地上写下它周围8 个方向相邻的格子中有几个雷.请帮助他输出写了之后的棋盘 输入输入第一行包含两个整数n, m 代表棋盘大小接下来n 行,每行m 个字符,代表棋盘1≤n,m≥1000 输出输出包含n 行,每行m 个字符,代表LGTB 写了数字之后的棋盘 样例 样例输入3 3*.*...*.* 样例输出*2*242*2* 提示:暴力 1 #include<iost

[铁一中OI模拟赛]2017.8.20 Day2

T1 LGTB 玩扫雷 题目链接 思考: 纯模拟题,没啥说的. #include <cstdio> #include <cstring> #define up(a,b,c) for(register int c=a;c<=b;++c) int n,m,map[1005][1005]; char s[233]; int fx[]={0,0,-1,-1,-1,0,1,1,1},fy[]={0,-1,-1,0,1,1,1,0,-1}; int main(){ //freopen(&

【学长虐学弟欢乐赛】Round3

第三套题 出题人:faebdc 金牌爷的题这么神竟然还有学长AK了QAQ 题目全都是CF上的 T1 D T2 E T3 D 神犇地址:faebdc学长的blog 试题下载地址 数据下载地址 话说题解的ppt用色果然还是faebdc神犇的常用配色= = 虚化色块喷涂拼接 T1 CF305D Olya ans Graph 原题可以自己去CF找 学长给的是翻译后题面 [问题描述] Olya 有一张 n 个点. m 条边的有向无权图, 所有点从 1 到 n 标号. 现在 Olya 想知道 有多少种添加有

数列分块入门1-9 LibreOJ

数列分块入门1-9 LibreOJ 我也不知道为什么一个大二的ACM选手没学分块. 我怎么记得大一的时候,学长教给我的分块就只有 block 和 num 两个变量来着...好吧,应该是我没认真学.正好前两天朋友给学弟开课,乘机去蹭了一节课.然后...我还是不会哇,菜的一逼塌糊涂. 还是卿学姐好哇,多听几遍,睡得贼香. 分块原理 分块嘛,其实就是优雅的暴力,和莫队(不会)有点异曲同工的赶脚.通过将数组分成小块以降低复杂度. 通常情况下: 每个块的大小(block)为 \(\sqrt{n}\) 块数

树套树Day2

滚回来更新,,, 在Day1我们学了最基本的线段树套平衡树 Day2开始我们要学习一些黑科技 (所以很大概率会出现Day3 w 1.线段树上的黑科技 这一段我们分几项来讲 1.权值线段树 权值线段树以权值为下标建树(就像求逆序对时用的树状数组),一开始所有节点都为0,通过线段树的区间极值,区间和来表示"这个区间上有多少个数"等信息. 下面这个代码并没有离散化因为我懒得写↓ #include <iostream> #include <cstdio> using n

20150127 学军集训 day1

day1 就直接考试... 和说好的不一样啊 第一题看都没怎么看就pass了,构造的题我一向没什么把握.然后瞟到第三题有30分可做,虽然要写的代码很大...反正我是写习惯了..期间纠结了一会还写了一个没用的lct .. 写了3h 骗了30分 (' '      ) 然后第二题n^2log 由于堆太丑还t了... 就拿了40 分然后就回来了... 然后现在没看懂第一题怎么做的...第二题的kd tree 明天写, 第三题的lct + 可修改主席树虽然宏大但单写也不是特别的蛋疼(' '      )