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

Grouping Increases

您将得到一个大小为 n 的数组 a。您将执行以下过程来计算惩罚:将数组 a 拆分为两个子序列 s 和 t(可能为空),使 a 的每个元素都在 s 或 t 中。
对于大小为 m 的数组 b,将数组 b 的惩罚  p(b) 定义为介于 1 和 m−1 之间的索引 i 的数量,其中 bi< bi+1。
您将收到的总罚款为 p(s)+p(t).
如果您以最佳方式执行上述过程,请找出您将收到的可能的最低处罚。
注意,将数组 a=[3,1,4,1,5] 拆分为 (s,t)的一些有效方法是 ([3,4,1,5],[1])、([1,1],[3,4,5])和([],[3,1,4,1,5]),而将数组a拆分为([3,4,5],[1])、([3,1,4,1],[1,5])、([1,3,4,1],[1,5])和([1,3,4],[5,1])的一些无效方法。

输入
每个测试包含多个测试用例。第一行包含一个整数t(1 ≤ t ≤ 1e4)——测试用例的数量。测试用例的描述如下。
每个测试用例的第一行包含一个整数 n(1 ≤ n ≤ 2e5)——数组a的大小。
第二行包含n个整数 a1,a2,…,an(1 ≤ ai ≤ n)——数组a的元素。
保证所有测试用例的 n 之和不超过 2e5。

输出
对于每个测试用例,输出一个整数,表示您将收到的可能的最小惩罚。

Input
5
5
1 2 3 4 5
8
8 2 3 1 1 7 4 3
5
3 3 3 3 3
1
1
2
2 1

Output
3
1
0
0
0

注:
在第一个测试用例中,拆分a的一种可能方法是 s=[2,4,5] 和 t=[1,3]。惩罚为 p(s)+p(t)=2+1=3。
在第二个测试用例中,拆分a的一种可能方法是 s=[8,3,1] 和 t=[2,1,7,4,3]。惩罚为 p(s)+p(t)=0+1=1。
在第三个测试用例中,拆分a的一种可能方式是 s=[] 和 t=[3,3,3,3,3]。惩罚为 p(s)+p(t)=0+0=0。

解析:

我们建立两个空数组 b和 c,之后将 a数组中的元素一个接一个插入 b和c,使得 a 中相邻 ai<ai+1 的个数减少。
惩罚函数只取决于相邻元素,所有我们只关心 b和 c的最后一个元素的值。假设我们已经将 a1,a2,…,ai−1 插入到数组 b和 c中,现在我们想要插入ai,假设 x 和 y 分别是数组 b和 c的最后一个元素。

假设 x ≤ y,
如果ai ≤ x,则将ai插入到具有较小最后一个元素的数组的后面。
如果y<ai,则将ai插入到具有较小最后一个元素的数组的后面。
如果x<ai ≤y,则将ai插入到最后一个元素较大的数组的后面。
当数组 b和c 为空时,令 x和y 无穷大。

ai ≤ x 在这种情况下,ai 不大于两个数组的最后一个元素,因此将 ai 插入任一数组的后面不会增加额外的惩罚。然而,最好将 ai 插入到最后一个元素较小的数组中,这样将来我们就可以在没有额外惩罚的情况下将更大范围的值插入到新数组中。
y<ai 在这种情况下,ai 大于两个数组的最后一个元素,因此将 ai 插入任一数组的后面将导致1个额外的惩罚。然而,最好将 ai 插入到最后一个元素较小的数组中,这样将来我们就可以在没有额外惩罚的情况下将更大范围的值插入到新数组中。
x< ai ≤y 在这种情况下,如果我们将ai插入到最后一个元素较大的数组的后面,则不会有任何额外的惩罚。然而,如果我们将 ai 插入到最后一个元素较小的数组的后面,则会有 1 的额外惩罚。前者总是比后者好。这是因为,如果我们考虑在两种情况下对其余元素 ai+1 到 an 做出相同的选择,则最多会有一次,前一种情况会比后一种情况多增加一个惩罚,因为前一种场景在插入 ai 后的最后一个元素较小。在这之后,两种情况下的阵列背面将变得相同,因此,前一种情况永远不会不那么优化。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
typedef pair<int,int> PII;
const double PI=acos(-1.0);
const int N=2e6+10;
int t,n;
int a[N];
int s[N],p[N];
signed main()
{ios;cin>>t;while (t--){cin>>n;for (int i=1;i<=n;i++) cin>>a[i];int l=0,r=0;s[l]=2e9,p[r]=2e9;for (int i=1;i<=n;i++){int x=a[i];if (s[l]<p[r]){if (s[l]>=x||p[r]<x) s[++l]=x;else p[++r]=x;}else {if (p[r]>=x||s[l]<x) p[++r]=x;else s[++l]=x;}}int cnt=0;for (int i=1;i<l;i++){if (s[i]<s[i+1]) cnt++;}for (int i=1;i<r;i++){if (p[i]<p[i+1]) cnt++;}cout<<cnt<<endl;}return 0;
}//精简版 
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
typedef pair<int,int> PII;
const double PI=acos(-1.0);
const int N=2e6+10;
int t,n;
int a[N];
signed main()
{ios;cin>>t;while (t--){cin>>n;for (int i=1;i<=n;i++) cin>>a[i];int l=2e9,r=2e9;int cnt=0;for (int i=1;i<=n;i++){int x=a[i];if (l>r) swap(l,r);if (x<=l) l=x;else if (r<x){l=x;cnt++;}else r=x;}cout<<cnt<<endl;}return 0;
}

相关文章:

  • alibabacloud学习笔记02(小滴课堂)
  • [python]使用pyqt5搭建yolov8 竹签计数一次性筷子计数系统
  • 镜头选型和计算
  • Linux之Ubuntu环境Jenkins部署前端项目
  • 【uniapp】APP打包上架应用商-注意事项
  • 2024年度 ROTS - 实时操作系统 Top 15
  • 【管理篇 / 登录】❀ 06. macOS下使用USB配置线登录 ❀ FortiGate 防火墙
  • 【Nodejs】基于node http模块的博客demo代码实现
  • Go后端开发 -- Go Modules
  • x-cmd pkg | trafilatura - 网络爬虫和搜索引擎优化工具
  • async和await关键字
  • 解析千兆多模光模块SFP-GE-SX
  • 可视化速通知识点
  • kotlin isEmpty/isNotEmpty/isNullOrEmpty和isBlank/isNotBlank/isNullOrBlank
  • 数据结构期末复习(1)数据结构和算法 线性表
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • happypack两次报错的问题
  • js面向对象
  • Python打包系统简单入门
  • React组件设计模式(一)
  • Spring声明式事务管理之一:五大属性分析
  • 创建一种深思熟虑的文化
  • 讲清楚之javascript作用域
  • 前端攻城师
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 手机端车牌号码键盘的vue组件
  • 优秀架构师必须掌握的架构思维
  • 正则与JS中的正则
  • 自动记录MySQL慢查询快照脚本
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • Mac 上flink的安装与启动
  • ​香农与信息论三大定律
  • #Java第九次作业--输入输出流和文件操作
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (Python) SOAP Web Service (HTTP POST)
  • (二)linux使用docker容器运行mysql
  • (二)学习JVM —— 垃圾回收机制
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (一)Neo4j下载安装以及初次使用
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • *1 计算机基础和操作系统基础及几大协议
  • .gitignore文件设置了忽略但不生效
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .php文件都打不开,打不开php文件怎么办
  • // an array of int
  • :中兴通讯为何成功
  • @DataRedisTest测试redis从未如此丝滑
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • @Transactional 竟也能解决分布式事务?
  • [2016.7 day.5] T2