7划分数列(seq.pas/c/cpp)

【题目描述】

给你一个有n个元素的数列,要求把它划分成k段,使每段元素和的最大值最小

【输入格式】

第一行两个正整数n,k

第二行为此数列ai

【输出格式】

一行一个数,为题目所求答案

【样例输入】

5 2

2 1 3 4 5

【样例输出】

9

【数据规模】

30%数据 n <= 30, k <= 10

100%数据 n <= 100000, k <= n, ai <= 10^9

150%数据 n <= 100000, k <= n, |ai| <= 10^9(附:这50分超越了noip难度,大家可以无视)

【时限】

1s

刚拿到的时候没看数据觉得是动归,QAQ看了数据觉得应该要有优化,二分或者贪心吧。

然而考试的时候并没有做出来(╯‵□′)╯︵┻━┻后来看到大牛的题解,写得很好,贴在这里

http://blog.sina.com.cn/s/blog_9aa2786a01018ksx.html 量子压缩的新浪博客

标程果然二分,当然这道题最大的难点不在二分数据而在于判断是否能够划分这个数据;

下面代码中有足够的注释,文末贴出判断过程

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,k;
long long sum,maxn;
long long num[];
void read()
{
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)
{
scanf("%lld",&num[i]);
sum+=num[i];//记录总和;
maxn=max(maxn,num[i]);//记录最大值;
}
}
bool judge(int x)//判断能否划分这个数
{
long long temp=;
int pos=;//记录划分的段数;
for(int i=;i<=n;i++)
{
temp+=num[i];
if(temp<=x&&(temp+num[i+])>x)//在i这个位置可以划分;
{
temp=;//重置
pos++;//段数加一;
}
if(pos==k&&i<n) return ;//如果划分的段数将要超过k,那么不能划分为k段,即这个数不能划分;
}
return ;//否则能划分;
}
void work()//二分
{
long long r=sum;
long long l=maxn;
long long m;
while(l<=r)
{
long long mid=(l+r)/;
if(judge(mid))//若这个数可以划分,向左寻找比它小的下一个可以划分的数;
{
r=mid-;
m=mid;//记录这个可以划分的数;
}
else l=mid+;//若不能划分,向右寻找比它大的下一个可以划分的数;
}
printf("%lld",m);
}
int main()
{
freopen("seq.in","r",stdin);
freopen("seq.out","w",stdout);
read();
work();
return ;
}

下面的判断过程也许有点冗长(三个图),代码看懂的同学没有必要往下翻啦。

—!@¥~!#@W~……%——心情复杂的分割线lヾ(。`Д´。)——$—%……¥%¥#¥@#@@@!—

以样例为例,

第一次二分:l=5,r=15,mid=10;

judge

10可以划分,于是r=mid-1=9;

mid=(9+5)/2=7;

7不能划分(划分需要3段),所以l=8,mid=7,后面重复上述过程;

直到mid=9,

终于可以划分了(っ*´Д`)っ,此时m=9,r=8,l=8+1=9,因为l>r,所以二分完毕,打印答案。

前面十个数据没有负数,最后五个有_(:з」∠)_,现在还写不出来所以只得了100分没有AC这道题。

应该会有后续更新【╰(*°▽°*)╯

NOIP第二次模拟赛 stage1【划分数列(seq.pas/c/cpp)的更多相关文章

  1. 「Vijos 1284」「OIBH杯NOIP2006第二次模拟赛」佳佳的魔法阵

    佳佳的魔法阵 背景 也许是为了捕捉猎物(捕捉MM?),也许是因为其它原因,总之,佳佳准备设计一个魔法阵.而设计魔法阵涉及到的最关键问题,似乎就是那些带有魔力的宝石的摆放-- 描述 魔法阵是一个\(n ...

  2. 10-18 noip提高组模拟赛(codecomb)T1倍增[未填]

    T1只想到了找环,> <倍增的思想没有学过,所以看题解看得雨里雾里的(最近真的打算学一下! 题目出的挺好的,觉得noip极有可能出现T1T2T3,所以在此mark 刚开始T1以为是模拟,还 ...

  3. 【洛谷】NOIP提高组模拟赛Day2【动态开节点/树状数组】【双头链表模拟】

    U41571 Agent2 题目背景 炎炎夏日还没有过去,Agent们没有一个想出去外面搞事情的.每当ENLIGHTENED总部组织活动时,人人都说有空,结果到了活动日,却一个接着一个咕咕咕了.只有不 ...

  4. 10-18 noip提高组模拟赛(codecomb)T2贪心

    T2:找min:一直找最小的那个,直到a[i]-x+1小于0,就找次小的,以此类推: 求max,也是一样的,一直到最大的那个,直到次大的比之前最大的大,就找次大的: 这个模拟,可以用上priority ...

  5. [SinGuLaRiTy] NOIP互测模拟赛

    [SinGuLaRiTy-1045] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 源文件名 输入输出文件 时间限制 内存限制 淘气的cch ...

  6. [模拟赛] T2 不等数列

    Description 将1到n任意排列,然后在排列的每两个数之间根据他们的大小关系插入">"和"<".问在所有排列中,有多少个排列恰好有k个&qu ...

  7. 【洛谷】NOIP提高组模拟赛Day1【组合数学】【贪心+背包】【网络流判断是否满流以及流量方案】

    U41568 Agent1 题目背景 2018年11月17日,中国香港将会迎来一场XM大战,是世界各地的ENLIGHTENED与RESISTANCE开战的地点,某地 的ENLIGHTENED总部也想派 ...

  8. [LUOGU] NOIP提高组模拟赛Day1

    题外话:以Ingress为题材出的比赛好评,绿军好评 T1 考虑枚举第\(i\)个人作为左边必选的一个人,那左边剩余\(i-1\)个人,选法就是\(2^{i-1}\),也就是可以任意选或不选,右侧剩余 ...

  9. l洛谷 NOIP提高组模拟赛 Day2

    传送门 ## T1 区间修改+单点查询.差分树状数组. #include<iostream> #include<cstdio> #include<cstring> ...

随机推荐

  1. iOS开展UI一片—简单的浏览器观看节目

    iOS开发UI篇-简单的浏览器查看程序 一.程序实现要求 1.要求 2. 界面分析 (1) 须要读取或改动属性的控件须要设置属性 序号标签 图片 图片描写叙述 左边button 右边button (2 ...

  2. PHP自学4——通过函数将数组数据输出到html的Table标签中(使用函数的例子)

    这一节其实说实话并没有什么干货,不过为了防止PO主的懒癌的复发,还是坚持放一点东西,即使是内容和长度都令人发指.这一节通过一个函数来实现将数组中的内容输出html的Table标签当中显示. 函数文件— ...

  3. FormData实现文件上传实例

    单提交,文件上传是一个常用又十分麻烦的功能,以前要上传文件通常都是借助插件或者flash来实现,噼里啪啦的加载一大堆东西.自从有了HTML5的FormData后,老板再也不用担心我的上传了. Form ...

  4. sublime text 2 安装

    下载 http://pan.baidu.com/s/1eRemu0y http://jingyan.baidu.com/album/ff4116259b057c12e48237b8.html?pici ...

  5. 跳跃表 C#

               虽然avl树和红黑树在数据搜索和排序方面都是有效的数据结构,但是都显得特别麻烦,跳跃表就显得特别简单,虽然简单 不影响他性能,在平均情况下,其插入.删除.查找数据时间复杂度都是O ...

  6. Android 判断当前设备是否联网

    首先添加相关的权限: <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> ...

  7. Android_Dialog cancle 和dismiss 区别

    AlertDialog使用很方便,但是有一个问题就是:dismiss方法和cancel方法到底有什么不同? AlertDialog继承与Dialog,现在各位看看结构图: 然后在Dialog类中找到了 ...

  8. JavaScript基本概念(数组)

    1.数组方法 /** * join(str) * 将数组元素转换为字符串并使用参数中的字符串将各字符串链接起来 */ var a = [1, 2, 3]; a.join(); // "1,2 ...

  9. POJ 1052 Plato's Blocks

      Plato's Blocks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 734   Accepted: 296 De ...

  10. CSS自学笔记(16):CSS3 用户界面

    CSS3中,也新增了一些关于用户界面的属性,这些属性可以重设元素或者盒子的尺寸.轮廓等等. 新增的部分属性的浏览器支持情况 属性 浏览器支持 resize IE Firefox Chrome Safa ...