问题描述

  JiaoShou在爱琳大陆的旅行完毕,即将回家,为了纪念这次旅行,他决定带回一些礼物给好朋友。
  在走出了怪物森林以后,JiaoShou看到了排成一排的N个石子。
  这些石子很漂亮,JiaoShou决定以此为礼物。
  但是这N个石子被施加了一种特殊的魔法。
  如果要取走石子,必须按照以下的规则去取。
  每次必须取连续的2*K个石子,并且满足前K个石子的重量和小于等于S,后K个石子的重量和小于等于S。
  由于时间紧迫,Jiaoshou只能取一次。
  现在JiaoShou找到了聪明的你,问他最多可以带走多少个石子。

输入格式

  第一行两个整数N、S。
  第二行N个整数,用空格隔开,表示每个石子的重量。

输出格式

  第一行输出一个数表示JiaoShou最多能取走多少个石子。

样列输入

  8 3
  1 1 1 1 1 1 1 1

样列输出

 6

样列解释

  任意选择连续的6个1即可。

数据规模和约定

  对于20%的数据:N<=1000
  对于70%的数据:N<=100,000
  对于100%的数据:N<=1000,000,S<=10^12,每个石子的重量小于等于10^9,且非负


这里我们介绍两种方法二分法贪心(因数据过大超时) ,但是思路都会讲解一遍。

方法一:二分法

我们通过简单二分,拆出两部分来,一开始确定 l、r、mid的位置,l为起始位置,r为最后的石子,mid为中间位置 mid = (l + r)/2,且mid也表示K(1~mid)值,即一边所能拿的石子个数。确定左右两边拿的石子个数后,判断在位置mid的左右两边的石子个数是否有mid个,有则判断是否符合质量和小于等于S。代码解释已经很详细,看代码解析。不会含义的自己跟着代码动手画一画流程,便能理解到位。

图解:

代码:

#include<iostream>
using namespace std;typedef long long ll;
const int N = 1e6 + 5;
ll val[N];     //记录重量之和
ll s;
int n;//该函数的作用是,检查该长度下是否存在符合小于等于S的情况(mid代表其长度)
bool Check(int mid) {   for (int i = mid; i <= (n - mid); i++) {if ((val[i] - val[i - mid]) <= s && (val[i + mid] - val[i]) <= s) {return true;     //存在符合的长度}}return false;}int main() {int l, r, mid;ios::sync_with_stdio(false); //取消输入输出缓存,加快cin、cout运算时间cin >> n >> s;for (int i = 1; i <= n; i++) {cin >> val[i];val[i] += val[i - 1];      //滚动遍历1到i个石子的重量和}l = 1; r = n;while (l <= r) {mid = (l + r) / 2;if (Check(mid)) {l = mid + 1;     //该长度下存在符合的连续数,返回l后,}                     //mid长度加一,继续寻找更大长度下是否存在else {r = mid - 1;       //该长度下不存在符合的连续数,返回r后,}                        //mid长度减一,继续寻找更小长度下是否存在}cout << 2 * r << endl;       //r所在的位置就是一边的最大长度return 0;
}

方法二:贪心(数据过大超时,仅作为参考理解方法)

贪心就是从1到N,让每个数当作中心点,然后求出左右两边的数能符合条件的的情况。最后显出最大K,输出2*K;

代码:

#include<iostream>
using namespace std;typedef long long ll;
#define N int(1e6 + 5)ll val[N] = { 0 };          //记录前面的数之和
ll s;int main() {int n, ans = 0;int a, b;          //记录k的左右两边最多有几个数符合ios::sync_with_stdio(false);  //关闭流同步,加快cin,cout速度cin >> n >> s;for (int i = 1; i <= n; i++) {cin >> val[i];val[i] += val[i - 1];           //记录1到i个石子的重量和}for (int k = 1; k < n; k++) {a = 0;b = 0;if (ans >= (n - k)) break;      //若后面剩余的数小于等于ans,则找不出比ans更大连续数for (int i = k - 1; i >= 0; i--) {        //前半部分从k+1个数开始,找符合条件的if ((val[k] - val[i]) > s) {a = k - i - 1;         //记录此时符合前K个数之和小于S的Kbreak;}else if (i == 0) {a = k;                   //前K个数都符合,之和小于等于S}}for (int i = k + 1; i <= n; i++) {        //后半部分从k+1个数开始,找符合条件的if ((val[i] - val[k]) > s) {b = i - k - 1;break;}else if (i == n) {b = i - k;}}ans = max(ans, min(a, b));}cout << 2 * ans << endl;return 0;
}

蓝桥杯,算法训练 礼物 C++ 详情解析(二分法和贪心)相关推荐

  1. 蓝桥杯算法训练 礼物(java,个人想法,递归找临界点)

    蓝桥杯算法训练 礼物(java,个人想法,递归找临界点) 问题描述 JiaoShou在爱琳大陆的旅行完毕,即将回家,为了纪念这次旅行,他决定带回一些礼物给好朋友. 在走出了怪物森林以后,JiaoSho ...

  2. 蓝桥杯 算法训练——礼物(二分法)Python

    这个博客是摆烂小白冲刺蓝桥杯国赛的算法笔记,呜呜因为太过摆烂现在六级.期末和国赛全在一起是真的会栓Q的好吗...我每次学习懂一题都会很开心,吃饭都香那种开心(因为太过小白),今天是六一祝大家六一快乐啊 ...

  3. 蓝桥杯算法训练 礼物 C++详解

    资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 JiaoShou在爱琳大陆的旅行完毕,即将回家,为了纪念这次旅行,他决定带回一些礼物给好朋友. 在走出了怪物森林以后,JiaoShou ...

  4. 蓝桥杯 算法训练-礼物

    问题描述 JiaoShou在爱琳大陆的旅行完毕,即将回家,为了纪念这次旅行,他决定带回一些礼物给好朋友. 在走出了怪物森林以后,JiaoShou看到了排成一排的N个石子. 这些石子很漂亮,JiaoSh ...

  5. 蓝桥杯 算法训练 幸运的店家

    蓝桥杯 算法训练 幸运的店家 题目描述 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 炫炫开了一家商店,卖的货只有一个,XXX,XXX卖N元钱.有趣的是,世界上只有面值为3的幂的纸 ...

  6. 蓝桥杯 算法训练 Beaver's Calculator

    蓝桥杯 算法训练 Beaver's Calculator 问题描述 从万能词典来的聪明的海狸已经使我们惊讶了一次.他开发了一种新的计算器,他将此命名为"Beaver's Calculator ...

  7. 蓝桥杯 算法训练 印章

    蓝桥杯 算法训练 印章 共有n种图案的印章,每种图案的出现概率相同.小A买了m张印章,求小A集齐n种印章的概率. 输入输出: 一行两个正整数n和m 一个实数P表示答案,保留4位小数. 样例: 2 3 ...

  8. 蓝桥杯算法训练-24点(Python)

    问题描述 24点游戏是一个非常有意思的游戏,很流行,玩法很简单:给你4张牌,每张牌上有数字(其中A代表1,J代表11,Q代表12,K代表13),你可以利用数学中的加.减.乘.除以及括号想办法得到24, ...

  9. 蓝桥杯——算法训练——数字三角形

    蓝桥杯--算法训练--数字三角形 这道题不难,但是比较典型,可以作为动态规划(dp)的入门篇,属于线性dp(LIS,LCS和数字三角形都是此类题型). ------------------------ ...

最新文章

  1. mybatis 同名方法_MyBatis(四):xml配置详解
  2. jdbc封装mysql_实用JDBC数据库查询封装
  3. 夜间模式的开启与关闭,父模板的制作
  4. 4-剑指offer: 把数组排成最小的数
  5. 供应商的余额,从哪个表里取
  6. HTML--HTML入门篇(我想10分钟入门HTML,可以,交给我吧)
  7. sqlserver还原差异备份
  8. 猎洞高手轻松变身Gsuite 超级管理员接管他人的 Gsuite 账户
  9. 计算机组成原理收获与心得,学习计算机组成原理心得体会
  10. erp管理软件是什么
  11. 箫演奏技巧符号大全图解
  12. DOS命令是如何操作目录和文件夹的?
  13. 编程语言排行榜 - 2020年度最热门编程语言盘点!
  14. 零基础CSS入门教程(28)–CSS导航栏实例
  15. 常用下载方式的区别-BT下载、磁力链接、电驴
  16. python 跨知乎app发私信以及Python专栏30万用户信息爬取
  17. 《 HarmonyOS实战—HarmonyOS(鸿蒙)开发初体验,华为如何引领物联网时代》
  18. 如何设置SOCKS5代理?最全方法汇总!
  19. Python jieba库的介绍与使用
  20. win7计算机c盘搜索不到,Win7系统如何查找C盘中的ProgramData文件夹?

热门文章

  1. Java语言的26个细节
  2. 计算机中的加法器和比较器
  3. 这些CTF,不仅学技术,还有巨额奖金!
  4. FXTM富拓:交易基础:如何正确识别假突破
  5. Unity3D开发类似保龄球游戏
  6. 22、Camunda 补偿事件、事务子流程、分布式事务一致性
  7. 【数据结构】排序算法总结及代码实现
  8. c语言编程数码管显示文字,c语言编程数码管的显示
  9. matlab根据乐谱播放音乐,科学网-[原][Matlab][04] Midi音乐键盘-王楠的博文
  10. Doris 实践-Compaction调优 3