NOIP第二次模拟赛 stage1【划分数列(seq.pas/c/cpp)
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)的更多相关文章
- 「Vijos 1284」「OIBH杯NOIP2006第二次模拟赛」佳佳的魔法阵
佳佳的魔法阵 背景 也许是为了捕捉猎物(捕捉MM?),也许是因为其它原因,总之,佳佳准备设计一个魔法阵.而设计魔法阵涉及到的最关键问题,似乎就是那些带有魔力的宝石的摆放-- 描述 魔法阵是一个\(n ...
- 10-18 noip提高组模拟赛(codecomb)T1倍增[未填]
T1只想到了找环,> <倍增的思想没有学过,所以看题解看得雨里雾里的(最近真的打算学一下! 题目出的挺好的,觉得noip极有可能出现T1T2T3,所以在此mark 刚开始T1以为是模拟,还 ...
- 【洛谷】NOIP提高组模拟赛Day2【动态开节点/树状数组】【双头链表模拟】
U41571 Agent2 题目背景 炎炎夏日还没有过去,Agent们没有一个想出去外面搞事情的.每当ENLIGHTENED总部组织活动时,人人都说有空,结果到了活动日,却一个接着一个咕咕咕了.只有不 ...
- 10-18 noip提高组模拟赛(codecomb)T2贪心
T2:找min:一直找最小的那个,直到a[i]-x+1小于0,就找次小的,以此类推: 求max,也是一样的,一直到最大的那个,直到次大的比之前最大的大,就找次大的: 这个模拟,可以用上priority ...
- [SinGuLaRiTy] NOIP互测模拟赛
[SinGuLaRiTy-1045] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 源文件名 输入输出文件 时间限制 内存限制 淘气的cch ...
- [模拟赛] T2 不等数列
Description 将1到n任意排列,然后在排列的每两个数之间根据他们的大小关系插入">"和"<".问在所有排列中,有多少个排列恰好有k个&qu ...
- 【洛谷】NOIP提高组模拟赛Day1【组合数学】【贪心+背包】【网络流判断是否满流以及流量方案】
U41568 Agent1 题目背景 2018年11月17日,中国香港将会迎来一场XM大战,是世界各地的ENLIGHTENED与RESISTANCE开战的地点,某地 的ENLIGHTENED总部也想派 ...
- [LUOGU] NOIP提高组模拟赛Day1
题外话:以Ingress为题材出的比赛好评,绿军好评 T1 考虑枚举第\(i\)个人作为左边必选的一个人,那左边剩余\(i-1\)个人,选法就是\(2^{i-1}\),也就是可以任意选或不选,右侧剩余 ...
- l洛谷 NOIP提高组模拟赛 Day2
传送门 ## T1 区间修改+单点查询.差分树状数组. #include<iostream> #include<cstdio> #include<cstring> ...
随机推荐
- CF#263
昨天没打,今天写了一下,前三题都没有难度吧. A. Appleman and Easy Task time limit per test 1 second memory limit per test ...
- 关于OF和CF
很久很久前写的.越来越意识到作为一名科班出身的学生的重要性. 自己在使用IDA时,发现F5产生类似的这种代码. 其中有一句,v5 <= -141920797,我在想为什么是负数.如果把-1419 ...
- 《think in python》学习-8
字符串 字符串是一个序列,可以用方括号操作符来访问字符串中的单独字符 fruit = 'banana' letter = fruit[1] 方括号中的表达式称为下标 下标从0 开始 任何表达式,包括变 ...
- C 各种数据类型介绍
1.各种数据类型介绍: 基本数据类型最主要的特点是,其值不可以再分解为其它类型.也就是说,基本数据类型是自我说明的. 1.1整型 整形包括短整型.整形和长整形. 1.1.1短整形 short a=1; ...
- c#中的数据类型简介(枚举)
C#中的数据类型简介(枚举) 枚举的定义 根据MSDN上给出的定义,枚举是一个指定的常数集,其基础类型可以是除Char外的任何整型. 如果没有显式声明基础类型,则使用 Int32. Enum 是 .N ...
- 《C++ 标准库》读书笔记 - 第二章 Introduction to C++ and the Standard Library
1. History of the C++ Standards 1.1 History of the C++ Standards C++98 -> C++03 -> TR1 -> C ...
- 在Google map图上做标记,并把标记相连接
<!DOCTYPE html> <html> <head> <title>GeoLocation</title> <meta name ...
- 判断mysqli函数里的sql语句是否有错和影响行数
<?php $mysqli=@new mysqli("localhost", "root", "123456", "xsph ...
- knockout computed实例
function Privilege(options) { var self = this; self.fieldId = options.fieldId; self.readAccessType = ...
- python sys.exit()函数说明
sys.exit()函数是通过抛出异常的方式来终止进程的,也就是说如果它抛出来的异常被捕捉到了的话程序就不会退出了. #!/usr/bin/python #!coding:utf-8 import s ...