CF2063D Game With Triangles 反悔贪心

news/2025/2/28 15:19:04/文章来源:https://www.cnblogs.com/lwiwi/p/18743347

传送门

一开始想法是对的,但是写的丑了导致大数据一直没过去

由于我们只关心所选的区间长度和剩余的点的数量,并不关心具体选了哪些点,所以按照反悔贪心一贯的,用优先队列来储存选了哪些区间和哪些区间未选,剩余点的数量用n,m表示即可。用l,r双指针的方式从首尾选区间固然可以,但是这样就维护了额外的多余的量,容易出错

```cpp
#include<bits/stdc++.h>using namespace std;long long t;
const long long N = 2e5 + 10;
long long n,m,k;
long long a[N],b[N],ans[N];void solve() {for(long long i = 0;i <= k;i++) ans[i] = 0;cin >> n >> m;for(long long i = 1;i <= n;i++) cin >> a[i];for(long long i = 1;i <= m;i++) cin >> b[i];sort(a + 1,a + 1 + n);sort(b + 1,b + 1 + m);if(min(n,m) * 2 <= max(n,m)) k = min(n,m);else k = (n + m) / 3;cout << k << '\n';priority_queue<long long> qa,qb;priority_queue<long long,vector<long long>,greater<long long> > pa,pb;//由于我仅仅只关注上下两条线各自点的数量和最大区间长度,并不关心该区间两端端点具体是什么,所以我们采用优先队列储存区间长度,n,m记录各自剩余点的个数即可,反悔的过程当中也仅仅只要用到各自剩余点的个数和已经加了的的区间长度for(long long i = 1;i <= n / 2;i++) qa.push(a[n - i + 1] - a[i]);for(long long i = 1;i <= m / 2;i++) qb.push(b[m - i + 1] - b[i]);long long tmp = n + m,res = 0;while(1) {if(n >= 2 && m >= 2) {n--,m--;if(qa.top() > qb.top()) res += qa.top(),n--,pa.push(qa.top()),qa.pop();else res += qb.top(),m--,pb.push(qb.top()),qb.pop();}else if(n >= 2) {if(m == 0) {if(pb.empty()) break;res -= pb.top();pb.pop();m += 2;n++;}res += qa.top();n -= 2;m--;pa.push(qa.top());qa.pop();}else if(m >= 2) {if(n == 0) {if(pa.empty()) break;res -= pa.top();pa.pop();n += 2;m++;}res += qb.top();m -= 2;n--;pb.push(qb.top());qb.pop();}else break;ans[(tmp - n - m) / 3] = max(ans[(tmp - n - m) / 3],res);}for(long long i = 1;i <= k;i++) cout << ans[i] << ' ';cout << '\n';
}signed main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> t;while(t--) solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/891181.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

西数硬盘二次开盘数据恢复之国外损坏带回在北京恢复失败盘片划伤

这是一块西部数据2T的移动硬盘,北京客户寄过来的,用户在国外工作的时候就损坏不识别了,但当地修复不了,回国后就在北京找了一家数据恢复公司进行处理,但由于盘片有划伤,没能恢复出数据,后来客户找到我们,想再尝试一下,因为里面有海外工作时几百G的工程项目资料,比较重…

mysql多表

一、表格 员工表 sid:员工编号、name:姓名、age:年龄、woektime_start 入职时间,incoming工资 dept2 部门编号部门表 dept1 部门编号,dept_name 部门名称二、建表语句 CREATE table dept( dept1 VARCHAR(6), dept_name VARCHAR(20)) default charset=utf8; INSERT into d…

重磅 | Cloud Ace 推出 GenAIOps 服务:加速企业生成式 AI 商业落地

Cloud Ace 宣布推出 GenAIOps 服务,主要业务是面向国内外企业:提供与生成式 AI 运维支持相关的专业服务及运维服务 转售符合客户需求的高度创新产品及咨询服务该服务旨在以尖端技术赋能企业,为客户提供最优的 AI 解决方案,最大化生成式 AI 的商业价值与成果。联系我们—Clo…

SAP 中类的使用

一、事务代码:SE24 二、步骤 2.1、创建类:se24实例化类型public:该类可以在任何地方进行初始化Protected:只能在自身和或类的子类中进行初始化Private: 只能自身的类中进行初始化Abstract: 不可以创建实例。 2.2、创建属性 2.2.1、选择属性 在属性分页签中先按上图填写好属性…

字符串数组指针变量的地址关系

deque是一个指向字符串数组的指针变量(char **deque)。下面我用图示来介绍下,字符串数组的相关概念。 首先定义一个字符串数组指针 char **deque;然后再申请N个数组空间 deque = (char **)malloc(N * sizeof(char *));此时deque就是一个拥有N个字符串指针的数组。然后向第一…

牛客题解 | 斐波那契数列_1

牛客题库题解题目 题目链接 描述 此题是非常经典的入门题了。我记得第一次遇到此题是在课堂上,老师拿来讲“递归”的(哈哈哈)。同样的类型的题还有兔子繁殖的问题。大同小异。此题将用三个方法来解决,从入门到会做。 考察知识:递归,记忆化搜索,动态规划和动态规划的空间…

牛客题解 | 整数中1出现的次数(从1到n整数中1出现的次数)

牛客题库题解题目 题目链接 题目的主要信息:输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数举一反三: 学习完本题的思路你可以解决如下题目: JZ17. 打印从1到最大的n位数 JZ15. 二进制中1的个数 方法一:按位统计法(推荐使用) 思路: 数字都是由位数组成,某…

牛客题解 | 数组中重复的数字

牛客题库题解题目 题目链接 题目的主要信息:一个长度为\(n\)的数组中只有0到\(n-1\)的数字 需要找出其中任意一个重复出现的数字举一反三: 学习完本题的思路你可以解决如下题目: JZ56. 数组中只出现一次的两个数字 JZ50. 第一个只出现一次的字符 JZ75. 字符流中第一个不重复…

牛客题解 | 数据流中的中位数

牛客题库题解题目 题目链接 题目主要信息:寻找数据的中位数 数据量在不断输入增长举一反三: 学习完本题的思路你可以解决如下题目: BM46. 最小的k个数 方法一:插入排序法(推荐使用) 知识点:插入排序 插入排序是排序中的一种方式,一旦一个无序数组开始排序,它前面部分就…

牛客题解 | 数组中出现次数超过一半的数字

牛客题库题解题目 题目链接 题目主要信息:题目给出一个长度为n的数组,其中有一个数字出现次数超过了数组长度的一半,需要我们找出这个数字 输入数组非空,保证有解,这样就不用考虑特殊情况举一反三: 学习完本题的思路你可以解决如下题目: BM52. 数组中只出现一次的两个数字…

牛客题解 | 数值的整数次方

牛客题库题解题目 题目链接 题目的主要信息:求一个浮点数的整数次方 整数有正有负 不可以使用库函数,也不需要判断大数问题举一反三: 学习完本题的思路你可以解决如下题目: JZ83. 剪绳子(进阶版) 方法一:直接运算(推荐使用) 思路: 既然是求次方,那我们做不断累乘就可…

支付宝 IoT 设备入门宝典(下)设备经营篇

本篇会以支付宝 IoT 设备经营为中心,介绍常见的设备相关能力和问题解决方案,帮助商户利用设备进行运营动作,让设备更好的帮助自己上篇介绍了支付宝 IoT 设备管理,但除了这些基础功能外,商户还可以利用设备进行一些运营动作,让设备更好的帮助自己,本篇就会以设备经营为中…