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

CF2032C Trinity 解题报告

题目描述

给定长度为 \(n\) 的序列 \(a\),修改其中的一些数使得对于序列 \(a\) 中的任意三个数都能组成三角形,即两短边之和大于最长边。求出最少修改的数的个数。

解题思路

考虑到如果一个序列的最小的两个数之和大于第三个数,那么这个序列一定合法。那么进行修改的时候尽量修改最小连续的几个(或 \(0\) 个)数和最大连续的几个(或 \(0\) 个)数,使得中间没有被修改的序列为一个合法序列,被修改的数只需修改成中间这个合法序列中的数即可使整个序列合法。

那么这个问题就转化成了:找出 \(a\) 排序后的最长的连续合法子序列,若这个序列的长度为 \(k\),则答案就是 \(n-k\)

寻找这个连续序列的长度,考虑排序后双指针。令 \(l\)\(r\) 分别为这个序列的首尾,若 \(a_l+a_{l+1}>a_r\) 则此序列合法,此时 r++,判断将 \(r\) 右移后是否还合法,合法继续右移,不合法就用合法序列的长度更新答案,然后右移 \(l\) 继续判断。特别地,当 \(r-l<3\) 时,此序列组不成三元组,无法判断合法,此时必须将 \(r\) 右移。

此外,如果整个序列都不存在合法的三元组,此时只需要选择两个数不变,剩下的数都修改为这两个数中较大的那个数即可满足合法,答案为 \(n-2\)

排序时间复杂度 \(O(n\log n)\),双指针时间复杂度 \(O(n)\),总时间复杂度 \(O(n\log n)\)

AC Code

#include<iostream>
#include<algorithm>
#define N 200005
using namespace std;
int T,n;
int a[N];
int re()//防止作弊不放快读快写
void wr(int x)
signed main()
{T=re();while(T--){n=re();for(int i=1;i<=n;i++)a[i]=re();sort(a+1,a+n+1);int maxx=0;//答案 int l=1,r=3;//保证区间长度while(r<=n){while((a[l]+a[l+1]>a[r]||r-l<3)&&r<=n)//合法或者是长度小于 3 则 r 右移 r++;if(a[l]+a[l+1]>a[r-1])//合法序列:l~r-1,长度为 r-l maxx=max(maxx,r-l);l++;//不合法 l 右移}if(!maxx)wr(n-2),putchar('\n');elsewr(n-maxx),putchar('\n');}return 0;
}
http://www.rkmt.cn/news/98713.html

相关文章:

  • 前端怎么学
  • 现代域名系统(DNS)深度技术架构与演进机制研究报告
  • 深入理解ref、reactive【Vue3工程级指南】
  • wangEditor处理站群平台word文档转存需求
  • 专网自实现域名系统的深度可行性研究与实施规划报告
  • C#之文件读取
  • 联想打印机维修与故障排除实用指南
  • 2025企业AI部署革命:T-pro-it-2.0-GGUF如何让本地化门槛直降60%?
  • CF1891B Deja Vu 解题报告
  • python环境及pip的操作
  • 清除企业不良记录的通知
  • 实习面试题-Zookeeper 面试题
  • 管理Linux的联网
  • CF958A1 Death Stars (easy) 解题报告
  • PS 例程大全
  • 如何利用JSP实现信创环境的大文件上传?
  • 实习面试题-Kotlin 面试题
  • JSP中如何利用分块技术实现百万文件上传优化?
  • Vim 分屏操作详解
  • wangEditor粘贴ppt母版样式自动适配网页
  • 63、技术综合指南:系统配置、数据库管理与网络应用
  • 嗨! Coze 的 AI 漫游:解锁智能体与工作流,轻松拿捏智能应用(1) - 实践
  • 50、Mono应用开发与Linux机器安全防护
  • 51、Linux 系统安全防护全攻略
  • 告别 AI 信息焦虑!这 5 个公众号,帮你轻松跟上智能时代节奏 - 品牌鉴赏师
  • 52、系统性能调优指南
  • Unity学习笔记(十七)GUI控件(一)
  • Origin科研绘图——手把手教你“分段拟合”
  • 53、Linux 系统优化与命令行操作指南
  • 54、Linux命令行与软件管理全攻略