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 块中的最大值

样例

样例输入
10
2 5 1 4 7 3 6 2 5 1

样例输出
14

解题报告

  拿到这道题被“假设3 块各自的和中的最大值最小” 这句话给弄懵B 了......足足懵了半个小时,最后在同学的帮助下理解了。就是有很多种取块的方法,每一个方法取得值为各个块和的最大值sum,然后找出这么多取法中sum最小的值。。。。

 然后就可以开始暴力了。

  还有一种 求平均值的方法;

 #include<iostream>
#include<cstdio>
using namespace std;
inline long long max(long long a,long long b)
{
if(a>b)return a;
else return b;
}
inline long long min(long long a,long long b)//mustwriteforlonglong!!!
{
if(a<b)return a;
else return b;
}
inline long long qmax(long long a,long long b,long long c)
{
long long ma=max(a,b);
return max(ma,c);
}
inline long long qmin(long long a,long long b,long long c,long long d)
{
long long mi=min(a,b);
mi=min(mi,c);
return min(mi,d);
}
long long a[],tot1,tot2,tot3,sum,k1,k2,par,minl;
int main()
{
// freopen("divide.in","r",stdin);
//freopen("divide.out","w",stdout);
int n;
cin>>n;
for(int i=;i<=n;i++)
{
scanf("%lld",&a[i]);
sum+=a[i];
}
long long e=3LL;
par=sum/e;
for(int i=;i<=n;i++)
{
tot1+=a[i];
if(tot1>=par)
{
k1=i;
break;
}
}
for(int i=n;i>=;i--)
{
tot2+=a[i];
if(tot2>=par)
{
k2=i;
break;
}
}
tot3=sum-tot1-tot2;
minl=qmin(qmax(tot3,tot1,tot2),qmax(tot3+a[k1],tot1-a[k1],tot2),qmax(tot3+a[k2],tot1,tot2-a[k2]),qmax(tot3+a[k1]+a[k2],tot1-a[k1],tot2-a[k2]));
cout<<minl;
}

  但其实正解是只枚举第一条边,然后 对剩下的部分 二分 查找。记录比较最大值和最小值。

代码如下:

 #include<iostream>
#include<cstdio>
using namespace std;
int n;
long long a[],sum[],ans;
long long min(long long a,long b)
{
return a>b?b:a;
}
long long max(long long a,long b)
{
return a<b?b:a;
}
int main()
{
freopen("divide.in","r",stdin);
freopen("divide.out","w",stdout);
cin>>n;
for (int i=;i<=n;i++)
{
scanf("%d",&a[i]);
sum[i]=sum[i-]+a[i];//前缀和
}
ans=sum[n];// "yournum+ll(LL)"
for (int i=;i<=n;i++)
{
long long sa=sum[i-];
int l=i+,r=n+;//l=i+1?? r=n+1??
while (l<r-)//二分 l<r-1???
{
int mid=(l+r)>>;
if (sum[mid-]-sa<=sum[n]-sum[mid-])//mid-1??
l=mid;
else r=mid;
}
long long sb=sum[l-]-sa,sc=sum[n]-sum[l-];//the ans may be the third one
ans=min(ans,max(sa,max(sb,sc)));
sb=sum[l]-sa;sc=sum[n]-sum[l];//the ans may be the second one
ans=min(ans,max(sa,max(sb,sc)));
}
cout<<ans;
return ;
}

注意事项:

  1、对long long 赋最大值要 long long x=12346789LL(或小写)  ;

  2、各种边界。/*还没弄懂*/

神奇的NOIP模拟赛 T2 LGTB 学分块的更多相关文章

  1. 神奇的NOIP模拟赛 T3 LGTB 玩THD

    LGTB 玩THD LGTB 最近在玩一个类似DOTA 的游戏名叫THD有一天他在守一座塔,对面的N 个小兵排成一列从近到远站在塔前面每个小兵有一定的血量hi,杀死后有一定的金钱gi每一秒,他都可以攻 ...

  2. 神奇的NOIP模拟赛 T1 LGTB 玩扫雷

    LGTB 玩扫雷 在一个n m 的棋盘上,有位置上有雷(用“*” 表示),其他位置是空地(用“.” 表示).LGTB 想在每个空地上写下它周围8 个方向相邻的格子中有几个雷.请帮助他输出写了之后的棋盘 ...

  3. 20161003 NOIP 模拟赛 T2 解题报告

    Weed duyege的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹. 为了查出真相,duyege 准备修好电脑之后再进行一次金坷垃的模拟实验. 电脑上面有若干层金坷垃,每次只能在上面撒上一层高度为 ...

  4. 20161023 NOIP 模拟赛 T2 解题报告

    Task 2.回文串计数 (calc.pas/calc.c/calc.cpp) [题目描述] 虽然是一名理科生,Mcx常常声称自己是一名真正的文科生.不知为何,他对于背诵总有一种莫名的热爱,这也促使他 ...

  5. 20161005 NOIP 模拟赛 T2 解题报告

    beautiful 2.1 题目描述 一个长度为 n 的序列,对于每个位置 i 的数 ai 都有一个优美值,其定义是:找到序列中最 长的一段 [l, r],满足 l ≤ i ≤ r,且 [l, r] ...

  6. 2018.02.12 noip模拟赛T2

    二兵的赌注 Description游戏中,二兵要进入了一家奇怪的赌场.赌场中有n个庄家,每个庄家都可以猜大猜小,猜一次一元钱.每一次开彩前,你都可以到任意个庄家那里下赌注.如果开彩结果是大,你就可以得 ...

  7. ztz11的noip模拟赛T2:查房

    链接: https://www.luogu.org/problemnew/show/U46611 思路: 这道题告你n-1条边就是骗你的 部分分也是骗你的 这道题连对边5分钟的事 一个点对另一个点有影 ...

  8. 2018.10.30 NOIp模拟赛T2 数字对

    [题目描述] 小 H 是个善于思考的学生,现在她又在思考一个有关序列的问题.        她的面前浮现出一个长度为 n 的序列{ai},她想找出一段区间[L, R](1 <= L <= ...

  9. 【2019.8.20 NOIP模拟赛 T2】小B的树(tree)(树形DP)

    树形\(DP\) 考虑设\(f_{i,j,k}\)表示在\(i\)的子树内,从\(i\)向下的最长链长度为\(j\),\(i\)子树内直径长度为\(k\)的概率. 然后我们就能发现这个东西直接转移是几 ...

随机推荐

  1. jQuery学习笔记:attr()与prop()的区别

    先看看官方文档是如何解释两者之间功能差异的: attr() Get the value of an attribute for the first element in the set of matc ...

  2. Request 接收参数乱码原理解析

    起因: 今天早上被同事问了一个问题:说接收到的参数是乱码,让我帮着解决一下. 实际情景: 同事负责的平台是Ext.js框架搭建的,web.config配置文件里配置了全局为“GB2312”编码: &l ...

  3. Lua中点和冒号的区别

    在使用lua设计类时'.'和':'的区别主要在于使用'.'必须手动加self参数,使用':',可以隐藏这个参数,使用'.'调用使用':'定义的函数时,要注意,函数的第一个参数为self,如 funct ...

  4. MM--发票校验 及基于采购订单的MIRO发票校验过程(

    一.介绍发票校验是物料管理(MM)系统的一部分.它提供物料管理部分和财务会计, 成本控制和资产管理部分的连接.物料管理模块的发票校验为以下目的服务:它完成物料采购的全过程 - 物料采购从采购申请开始, ...

  5. 2016年Web前端面试题目汇总

    转载: 2016年Web前端面试题目汇总 以下是收集一些面试中经常会遇到的经典面试题以及自己面试过程中未解决的问题,通过对知识的整理以及经验的总结,重新巩固自身的前端基础知识,如有错误或更好的答案,欢 ...

  6. div布局

    Margin: Margin属性用于设置两个元素之间的距离. Padding: Padding属性用于设置一个元素的边框与其内容的距离. Clear: 使用Float属性设置一行有多个DIV后(多列) ...

  7. python 练习 19

    #!/usr/bin/python # -*- coding: UTF-8 -*- for n in range(100,1000): i = n / 100 j = n / 10 % 10 k = ...

  8. ERROR 1130: Host 'root@localhost' is not allowed to connect to MySQL server

    连接mysql时遇到的错误. 原因:该用户没有权限连接访问mysql数据库 解决方法:网站上搜了好多,试了都没有用.最终在登陆的信息页面用root用户登陆时不输入root密码即可.

  9. XPath语法 在C#中使用XPath示例 【转http://www.cnblogs.com/yukaizhao/archive/2011/07/25/xpath.html】非常详细的文章

    XPath语法 在C#中使用XPath示例   XPath可以快速定位到Xml中的节点或者属性.XPath语法很简单,但是强大够用,它也是使用xslt的基础知识. 示例Xml: <?xml ve ...

  10. jquery UI datepicker时间控件的使用

    参考: http://api.jqueryui.com/datepicker/#method-show 英文 http://www.helloweba.com/view-blog-168.html 中 ...