当前位置: 首页 > news >正文

【C++贪心】P9344 去年天气旧亭台|普及

本文涉及知识点

C++贪心

去年天气旧亭台

题目背景

依旧是过往的天气,过往的楼台烟雨。时间悄悄流逝着,山河仍在,人却已不是过去的人……

题目描述

登上楼台,旧时满面沉灰的地板映入眼帘。

共有 n n n 块地板,地板分为两类,第 i i i 块地板的类别用 c i c_i ci 表示,积灰程度用 a i a_i ai 表示。注意 c i c_i ci 0 0 0 1 1 1

现在要清理这些地板上的灰尘。每次操作中,你可以:

  • 选择两个下标 i , j i,j i,j,满足 1 ≤ i ≤ j ≤ n 1\leq i\leq j\leq n 1ijn c i = c j c_i=c_j ci=cj且第 i i i 块和第 j j j 块地板上的灰尘均未被清理过
  • 花费 a i + a j a_i+a_j ai+aj 的能量清理 i i i 块到第 j j j 块所有地板上的灰尘。

求清理完所有地板上的灰尘至少要多少能量。

输入格式

本题有多组测试数据

第一行一个整数 T T T,表示测试数据组数。

对于每组测试数据:

  • 第一行一个整数 n n n
  • 第二行 n n n 个整数 a 1 , a 2 , … , a n a_1,a_2,\dots,a_n a1,a2,,an
  • 第三行 n n n 个整数 c 1 , c 2 , … , c n c_1,c_2,\dots,c_n c1,c2,,cn

输出格式

对于每组测试数据,一行一个整数表示最小能量。

样例 #1

样例输入 #1

2
6
1 1 4 5 1 4
1 0 0 1 0 1
8
3 1 4 1 5 9 2 6
1 0 1 0 1 0 1 0

样例输出 #1

5
13

提示

【样例 1 解释】

  • 对于第一组数据,直接花费 a 1 + a 6 = 5 a_1+a_6=5 a1+a6=5 的能量清理所有灰尘。
  • 对于第二组数据,先花费 a 1 + a 1 = 6 a_1+a_1=6 a1+a1=6 的能量清理第一个地板上的灰尘,再花费 a 2 + a 8 = 7 a_2+a_8=7 a2+a8=7 的能量清理剩余灰尘。

【数据规模与约定】

对于 10 % 10\% 10% 的数据,保证 T ≤ 10 T\le 10 T10 n ≤ 10 n\le 10 n10

对于 40 % 40\% 40% 的数据,保证 T ≤ 20 T\le 20 T20 n ≤ 1 0 3 n\le 10^3 n103

另有 10 % 10\% 10% 的数据,保证 c i = 1 c_i=1 ci=1

对于 100 % 100\% 100% 的数据,保证 1 ≤ T ≤ 1 0 5 1 \le T \le 10^5 1T105 1 ≤ n , ∑ n ≤ 2 × 1 0 6 1 \le n,\sum n\le 2 \times 10^6 1n,n2×106 c i ∈ { 0 , 1 } c_i \in \{0,1\} ci{0,1} 1 ≤ a i ≤ 1 0 9 1 \le a_i \le 10^9 1ai109

贪心

我们把每次的操作的i,j,看做一个以i和j为端点的线段。
性质一:两条线段不会包含,否则取消被包含的线段。操作成本更小。
性质二:两条线段不会交叉,否则后面操作的i或j,已经清理。
性质三:所有地板都要清理,故所有线段都相邻。
性质四:1和N必定是线段的顶端。
推论一:如果1和N的类型相同,则直接[1,N],成本最小。
如果1和N类型不同,至少两条线段:且第一线段[1,i1],第二条线段以i1+1为起点。即至少包括4个端点1,i,i+1,N。[i1+1,N]便是最优解。
i1和必须和1的类型同,i1+1必须和N的类型同。
枚举i1,i1 ∈ \in [1,N-1]

代码

核心代码

#include <iostream>
#include <sstream>
#include <vector>
#include<map>
#include<unordered_map>
#include<set>
#include<unordered_set>
#include<string>
#include<algorithm>
#include<functional>
#include<queue>
#include <stack>
#include<iomanip>
#include<numeric>
#include <math.h>
#include <climits>#include <bitset>
using namespace std;template<class T = int>
vector<T> Read(int n,const char* pFormat = "%d") {vector<T> ret;T d ;while (n--) {scanf(pFormat, &d);ret.emplace_back(d);}return ret;
}template<class T = int>
vector<T> Read( const char* pFormat = "%d") {int n;scanf("%d", &n);vector<T> ret;T d;while (n--) {scanf(pFormat, &d);ret.emplace_back(d);}return ret;
}string ReadChar(int n) {string str;char ch;while (n--) {do{scanf("%c", &ch);} while (('\n' == ch));str += ch;}return str;
}class Solution {
public:long long MaxS(vector<int> a,vector<int> c) {const int N = a.size();long long ans = a.front() + a.back();int other = INT_MAX;if (c.front() == c.back()) { return ans ; }for (int i = 0; i + 1 < N; i++) {if ((c[i] == c[0]) && (c[i + 1] == c.back())) {other = min(other, a[i] + a[i + 1]);}}return ans + other;}
};int main() {
#ifdef _DEBUGfreopen("a.in", "r", stdin);
#endif // DEBUGint T;scanf("%d", &T);while (T--) {int n;scanf("%d", &n);auto a = Read<int>(n);auto c = Read<int>(n);auto res = Solution().MaxS(a, c);cout << res << std::endl;}	return 0;
}

单元测试

	vector<int> a, c;TEST_METHOD(TestMethod11){a = { 1,1,4,5,1,4 }, c = { 1,0,0,1,0,1 };auto res = Solution().MaxS(a, c);AssertEx(5ll, res);}TEST_METHOD(TestMethod12){a = { 3,1,4,1,5,9,2,6 }, c = { 1,0,1,0,1,0,1,0 };auto res = Solution().MaxS(a, c);AssertEx(13ll, res);}

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

http://www.xdnf.cn/news/329527.html

相关文章:

  • Spark处理过程-转换算子和行动算子
  • NumPy 2.x 完全指南【一】简介
  • 混淆矩阵(Confusion Matrix)
  • Qt开发经验 --- 避坑指南(5)
  • python打卡day18
  • Spring MVC中跨域问题处理
  • 把一个过大的文件夹分成若干个 ZIP 分卷
  • 雅努斯问题(Janus Problem)及解决方案
  • 三轴云台之模糊控制算法篇
  • Golang的linux运行环境的安装与配置
  • AB测试面试题
  • MCP学习
  • 行动作用作用
  • 后端返回文件流,前端展示图片
  • 003 系统和入门指令
  • 【基础知识】常见公式计算(三)
  • 情感共鸣+海外网红营销:跨境电商如何讲好“母亲节”故事?
  • BRAM 64bit位宽报错问题
  • C++ 如何在一个方法中返回多个不同类型的数据
  • [D1,2] 贪心刷题
  • 深入剖析GoFrame日志模块:优势、特色与项目实践经验分享
  • 不同大模型对提示词和问题的符号标识
  • C++:买房子
  • 手动写一个vuex的可持续化插件
  • MySQL的行级锁锁的到底是什么?
  • [Windows] Ghost Downloader v3.5.9 开源多线程下载工具
  • Qt开发经验:回调函数的线程归属问题及回调函数中更新控件的问题
  • css识别\n换行
  • SEO关键词与长尾词精准布局策略
  • 海外短剧H5系统开发:技术架构、SEO优化与全球市场突围策略 [2025版]