题目描述
现有一堆值钱的木头,它们排成一行,河神给了你一个可以改变一个区间内的木头的价值的机会(注意这个区间不能越过边界),因为这是河神给你的选择,因此你必须要把握这次机会,也就是说你必须改变一个区间内木头的价值。
当然你的目的是让这堆木头的总价值最高。
输入
第一行输入一个T(T <= 5),表示测试数据总数。
接下来2*T行,每组数据有2行。
每组数据第一行首先输入一个n(n <= 100000),接下来输入n个整数,分别表示这些木头的价值(-1000<=木头价值<=1000)
每组数据第二行输入两个整数x,y,其中x表示可以改变的区间的大小,y表示你可以把这个区间内的木头价值变为y(1<= x <= n,-1000<=y<=1000)
输出
你需要输出你所能获得的最大价值(这个价值可能为负数,表明你可能被河神给坑了)
样例输入
1
5
2 -5 -5 23 -11
1 3
样例输出
18
提示
显然你只需要把-11改为3就可以得到最大价值18。

ps:

初次遇见前缀和的题目,虽然事后看完大佬的题解来补题,但是感觉前缀和思想挺简单的,如果还记得的话,那么应该是高中(初中)就有类似的题目。

方法一:
滚动区间
1.首先要明确题目的意思,题目说可以把任意区间内的元素替换为y,那么显然,替换后的区间价值就是x*y,在中学我们已经学过类似的思想,所以我们只需要知道替换前的价值,就可以知道替换后这堆木头的总价值。
2.首先设all是木头初始价值和,a是替换前区间价值,b是替换后区间价值,替换后木头总价值和为all-a+b,在这里我举个例子:all=4,a=-3,b=4,替换后我们增大了b-a,所以加上原先的就是all-a+b;
3.我们可以假设这个区间长度为2,那么就有12 ,23, 34, 45 …可能,我们把区间看成盒子,这个盒子从左往右移动,依次装入每个元素,但是盒子只能装两个,所以在装下一个之前我们就要把最前面那个丢弃(减去),这样我们就可以计算出所有的长度为2区间,我们只要计算替换之后的总价值就行,取最大的输出,这样就可以解决题目了

AC代码

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int s[maxn];
int main()
{int a, n, t, ans, x, y, b, all;scanf("%d", &t);while (t--){all = 0;scanf("%d", &n);for (int i = 1; i <= n; ++i){scanf("%d", &s[i]);all += s[i];}scanf("%d%d", &x, &y);int a = 0, b = x * y;for (int i = 1; i <= x; ++i)a += s[i];ans = all - a + b;for (int i = x + 1; i <= n; ++i){                 //前面提到的盒子思想a += s[i];     //装入下一个a -= s[i - x]; //减去最前面的ans = max(ans, all - a + b);}printf("%d\n", ans);}return 0;
}

方法二:
前缀和思想
其实感觉上下两个代码思想很类似,但是前缀和最大的有点就是极大的加快了代码的运行速度,大大缩短了时间
1.如果数组1,2,3,4,5,求前缀和,我们用另外一个数组来储存,那么就是1,3,6,10,15;
2.如果我们想求出i-j之间的和,只需要用pre[j]-pre[i-1],就可以得出

AC代码

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int s[maxn], pre[maxn];
int main()
{int n, b, a, ans, all, t, x, y;scanf("%d", &t);while (t--){all = 0;scanf("%d", &n);memset(pre, 0, sizeof(pre));for (int i = 1; i <= n; ++i){scanf("%d", &s[i]);all += s[i];}scanf("%d%d", &x, &y);for (int i = 1; i <= n; ++i)pre[i] = pre[i - 1] + s[i];b = x * y;ans = all - pre[x] + b;for (int i = x + 1; i <= n; ++i)ans = max(ans, all - pre[i] + pre[i - x] + b);printf("%d\n", ans);}return 0;
}
人生最好的境界,是丰富的安静

值钱的木头——前缀和思想相关推荐

  1. 【算法】leetcode 974. 和可被 K 整除的子数组(前缀和思想)

    前言 前缀和相关: leetcode 974. 和可被 K 整除的子数组(前缀和思想) leetcode 560. 和为K的子数组(前缀和思想II) 问题来源 974. 和可被 K 整除的子数组 给定 ...

  2. 二分法例题:聪明的质检员(运用了前缀和思想)

    小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1 到 n 逐一编号,每个矿石都有自己的重量 wi 以及价值 vi.检验矿产的流程是: 1.给定 m 个区间[Li, ...

  3. 算法刷题时经常用到的前缀和思想

    今天我们来说一下刷题时经常用到的前缀和思想,前缀和思想和滑动窗口会经常用在求子数组和子串问题上,当我们遇到此类问题时,则应该需要想到此类解题方式,该文章深入浅出描述前缀和思想,读完这个文章就会有属于自 ...

  4. 洛谷 P1865 A % B Problem[筛素数/前缀和思想/区间质数个数]

    题目描述 区间质数个数 输入输出格式 输入格式: 一行两个整数 询问次数n,范围m 接下来n行,每行两个整数 l,r 表示区间 输出格式: 对于每次询问输出个数 t,如l或r∉[1,m]输出 Cros ...

  5. LeetCode 898. 子数组按位或操作(前缀和思想)

    文章目录 1. 题目 2. 解题 2.1 超时解 2.2 正解 1. 题目 我们有一个非负整数数组 A. 对于每个(连续的)子数组 B = [A[i], A[i+1], ..., A[j]] ( i ...

  6. 一些用前缀思想解决的题(持续完善)

    有前缀和, 前缀GCD, 前缀奇数个数, 前缀偶数个数, 前缀差, 还有就是相对位置很重要的, 还有就是区间和的.等等(特别是区间和的, 一定可以用前缀和的思想来做!!!), 都要根据自己的思想来去解 ...

  7. Yet Another Counting Problem CodeForces - 1342C(规律+前缀和)

    You are given two integers a and b, and q queries. The i-th query consists of two numbers li and ri, ...

  8. LeetCode 1744. 你能在你最喜欢的那天吃到你最喜欢的糖果吗?(前缀和)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个下标从 0 开始的正整数数组 candiesCount ,其中 candiesCount[i] 表示你拥有的第 i 类糖果的数目. 同时给你一个二 ...

  9. 【BZOJ3932】任务查询系统,主席树与差分的建树思想

    Time:2016.05.08 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 说真的我一开始做这个题真不知道怎么建树,只知道应该以时间为根建树,记录优先值并维护前缀和,但想不出怎么 ...

  10. Leetcode 523 连续的子数组和 前缀和 + 哈希表

    题目链接 一维前缀和思想: s u m [ i ] sum[i] sum[i] = s u m [ i − 1 ] sum[i-1] sum[i−1] + a [ i ] a[i] a[i] sum[ ...

最新文章

  1. 【专家观点】张亚勤、张宏江:人工智能的未来是什么?
  2. ct读片软件_伦琴影领影像诊断中心:这六大MRI读片技巧,影像医生必须掌握
  3. 大学计算机基础课程报告python-大学计算机基础
  4. spring-bean依赖注入-02(通过p命名空间注入)
  5. 在SAP中如何创建权限和权限的设置
  6. 1011 World Cup Betting (20 分)_14行代码AC
  7. win8 iis8 asp.net 图片访问需登录
  8. Codeforces Round #726 (Div. 2) E2. Erase and Extend (Hard Version) 贪心
  9. Maven的一些资源(配置方法、idea中toggle offline mode:切换脱机模式、idea中Toggle ‘Skip Tests’ Mode、 Dependencies 出现红色波浪线)
  10. 解决VC++6.0打开文件或添加文件到工程出错的问题
  11. 图:活动现场双屏管理系统V3-多线程抽奖版软件,完美升级收工!历时3个月,艰辛坎坷...
  12. 安装Lync Server 2013
  13. 迅雷7核心技术Bolt界面引擎正式开放
  14. 电脑开机界面如何设置个性签名?
  15. Linux性能监控命令_nmon 安装与使用
  16. Autofill安装使用
  17. 行业知识 | 浅谈PDM与MES系统集成
  18. 如何看待软件开发 ?
  19. 一个自动配置 opengrok 多项目的脚本
  20. Flink教程(01)- Flink知识图谱

热门文章

  1. pythonturtle画飞机_Python获取航线信息并且制作成图的讲解
  2. godaddy不支持java_godaddy主机被墙的解决方案
  3. python中easygui()库的使用
  4. MD5加密中文字符问题详解
  5. 联通沃商店宣布独立运作 成立小沃科技公司
  6. 2021年起重机械指挥考试题库及起重机械指挥最新解析
  7. PM应具备的规划技巧-顾客价值管理
  8. 台式电脑主板插线步骤图_机箱上的跳线接在主板那些位置?台式电脑主板接线示意图解教程...
  9. Mysql 8.0.27 免安装配置教程(windows)
  10. gazebo教程(八)场景建模