A

本题描述了一个最优路径规划问题的解法,核心思路是利用数轴上区间覆盖的特性,将问题简化为两个端点的访问问题。以下是关键点的详细解析:

核心观察

  1. 区间覆盖特性

    • 给定的位置数组 x1, x2, ..., xn 是严格递增的(即 x1 < x2 < ... < xn)。
    • 在数轴上,若要访问区间 [x1, xn] 内的所有整数点,只需从起点移动到 x1 或 xn,再移动到另一个端点,即可覆盖中间的所有位置。
  2. 最优路径选择

    • 从起点 s 出发,访问 x1 和 xn 的路径只有两种可能:

      1. 路径 As → x1 → xn
        总步数:|s - x1| + |xn - x1|
      2. 路径 Bs → xn → x1
        总步数:|s - xn| + |xn - x1|
    • 两种路径的共同部分是 |xn - x1|(即区间长度),因此只需比较起点到两个端点的距离,取较小值。

公式推导

最优解的公式为:

min(|s - x1|, |s - xn|) + (xn - x1)

解释

  • min(|s - x1|, |s - xn|):选择起点 s 到区间左端点 x1 或右端点 xn 的较短距离。
  • xn - x1:区间的长度,即覆盖整个区间所需的最小步数。

算法实现

该算法的时间复杂度为 O(1),因为只需读取输入并计算两个端点的位置。具体步骤:

  1. 读取输入的起点 s 和位置数组 x
  2. 计算 x1(数组第一个元素)和 xn(数组最后一个元素)。
  3. 代入公式 min(|s - x1|, |s - xn|) + (xn - x1) 计算结果。

代码

#include<bits/stdc++.h>
using namespace std;
void solve(){int n,s;cin>>n>>s;int a[n+1];for(int i=1;i<=n;i++){cin>>a[i];}int l=min(abs(a[1]-s),abs(a[n]-s))+a[n]-a[1];cout<<l<<endl;
}
int main(){int t;cin>>t;while(t--)solve();return 0;
}

B

简化问题

  • 如果存在满足条件的分割方案,则必然存在一种方案使得中间字符串b的长度为 1。
  • 证明:假设存在分割s = a + b + c,其中|b| ≥ 1。选择b中的任意字符x,将b拆分为b = b_prefix + x + b_suffix,则新的分割为:

    plaintext

    a' = a + b_prefix  
    b' = x  
    c' = b_suffix + c  
    

    这种转换不改变分割的有效性,因此只需考虑|b| = 1的情况。
  1. 字符出现次数的影响

    • 统计每个字符在s中出现的次数cnt[l]
    • 若存在某个字符l满足以下条件之一,则存在有效分割:
      1. 条件 1cnt[l] ≥ 3
        选择第二个出现的l作为b,其前后的字符分别构成ac
      2. 条件 2cnt[l] = 2s的首尾字符不全为l
        选择非首尾位置的l作为b,确保ac非空。

算法实现

贪心算法:通过局部最优选择(优先考虑|b|=1)达到全局最优解,避免枚举所有可能的分割方式。该算法的时间复杂度为 O(n),具体步骤:

  1. 统计字符频率
    遍历字符串s,统计每个字符的出现次数cnt[l]

  2. 检查条件 1
    若存在任何字符l的出现次数≥3,直接返回 "Yes"。

  3. 检查条件 2
    对于每个出现两次的字符l,检查:

    • s的首字符或尾字符不等于l,则返回 "Yes"。
  4. 返回结果
    若所有条件均不满足,返回 "No"。

代码

#include<bits/stdc++.h>
using namespace std;
void solve(){int n;cin>>n;string s;cin>>s;int cnt[30]={0};for(int i=0;i<s.length();i++){cnt[s[i]-'a']++;}bool flag=0;for(int i=0;i<26;i++){if(cnt[i]>2)flag=1;else if(cnt[i]==2&&(s[0]-'a'!=i||s.back()-'a'!=i))flag=1;}if(flag)cout<<"YES"<<endl;else cout<<"NO"<<endl;
}
int main(){int t;cin>>t;while(t--)solve();return 0;
}

C

矩阵操作后的最小可能最大值分析

这段文字描述了一个矩阵操作问题的解法,核心思路是通过分析矩阵中最大值的分布,确定执行一次操作后可能的最小最大值。关键点如下:

核心观察

  1. 答案的可能范围

    • 矩阵的初始最大值为 mx。执行一次操作后,答案只能是 mx-1 或 mx
    • 证明:无论选择哪一行 r 和列 c 进行操作,矩阵中的其他元素不会减少,因此最大值不可能小于 mx-1
  2. 何时答案为 mx-1

    • 当且仅当存在一个位置 (r, c),使得所有值为 mx 的元素都位于第 r 行第 c 列时,答案为 mx-1
    • 解释:选择这样的 (r, c) 进行操作后,所有 mx 元素都会减 1,从而新的最大值为 mx-1

算法实现步骤

  1. 预处理

    • 遍历矩阵,记录:
      • mx:矩阵中的最大值。
      • cnt_mxmx 出现的总次数。
      • r[i]:第 i行中 mx 出现的次数。
      • c[j]:第 j 列中 mx 出现的次
  2. 检查条件

    • 对于每个可能的位置 (i, j),计算:
      count = r[i] + c[j] - (a[i][j] == mx ? 1 : 0)
      

      其中,r[i] + c[j] 是第 ri行和第j列中 mx 的总次数,但如果 a[r][c] 是 mx,则被重复计算了一次,需要减去 1。
  3. 判断结果

  • 如果存在 (i,j) 使得 count == cnt_mx,则答案为 mx-1;否则为 mx

错解(数组开的过大):

#include<bits/stdc++.h>
using namespace std;
const int N=100005;  //数组过大
int a[N][N];
void solve(){int n,m;cin>>n>>m;int mx=0,cnt_mx=0;for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>a[i][j];if(a[i][j]>mx){mx=a[i][j];cnt_mx=1;}else if(a[i][j]==mx) cnt_mx++;}}int r[n]={0},c[m]={0};for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(a[i][j]==mx){r[i]++;c[j]++;}}}int flag=0;for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(r[i]+c[j]-(a[i][j]==mx?1:0)==cnt_mx) flag=1;}}cout<<mx-flag<<endl;
}
int main(){int t;cin>>t;while(t--)solve();return 0;
}

正确代码

根据题目约束 1≤n⋅m≤1e5,建议使用动态分配数组定义数组a,同时行数组和列数组使用变量(n,m)定义数组的大小。

使用vector嵌套来定义动态大小的矩阵

#include <vector>// 定义n行m列的矩阵,初始值为0
int n, m;
cin >> n >> m;
vector<vector<int>> matrix(n, vector<int>(m, 0));// 访问元素:matrix[i][j]
matrix[0][0] = 10;  // 第一行第一列赋值为10

解释

  • vector<vector<int>> matrix(n, ...):创建一个包含n个元素的外层 vector,每个元素是一个内层 vector。
  • vector<int>(m, 0):每个内层 vector 包含m个元素,初始值为 0。

总代码:

#include<bits/stdc++.h>
using namespace std;
void solve(){int n,m;cin>>n>>m;int mx=0,cnt_mx=0;vector<vector<int>>a(n,vector<int>(m));for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>a[i][j];if(a[i][j]>mx){mx=a[i][j];cnt_mx=1;}else if(a[i][j]==mx) cnt_mx++;}}int r[n]={0},c[m]={0};for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(a[i][j]==mx){r[i]++;c[j]++;}}}int flag=0;for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(r[i]+c[j]-(a[i][j]==mx?1:0)==cnt_mx) flag=1;}}cout<<mx-flag<<endl;
}
int main(){int t;cin>>t;while(t--)solve();return 0;
}

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

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

相关文章

ubuntu 18.04配置镜像源

配置镜像源的主要作用是优化软件下载速度、提升系统更新稳定性&#xff0c;并确保软件包获取的可靠性 我这里配置阿里云镜像源 镜像的具体内容参考此文: 文章链接 以防万一,先备份一下 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak然后开始修改 sudo nano /etc…

RecyclerView中跳转到最后一条item并确保它在可视区域内显示

在RecyclerView中跳转并显示最后一条Item 要在RecyclerView中跳转到最后一条item并确保它在可视区域内显示&#xff0c;可以使用以下几种方法&#xff1a; 1. 使用scrollToPosition()方法&#xff08;基本方法&#xff09; recyclerView.scrollToPosition(adapter.getItemCo…

ubuntu22 桌面版开启root登陆

一、先创建root sudo passwd root 二、注释代码 vim /etc/pam.d/gdm-password vim/etc/pam.d/gdm-autologin 都注释 auth required pam_succeed_if.so user ! root quiet_success 三、修改profile文件 vim /root/.profile 注释掉 mesg n 2&#xff1e; /dev/null || true 插入新…

docker学习二天之镜像操作与容器操作

镜像的一般运用过程 一、镜像&#xff08;Image&#xff09;操作 镜像是容器的基础模板&#xff0c;存储在本地或远程仓库中。 1. 镜像拉取 # 从指定镜像源拉取 docker pull docker.m.daocloud.io/library/nginx 2. 镜像查看 # 列出本地镜像 docker images # 或 docker image…

多个参数用websocket 向io 服务器发送变量,一次发一个,并接收响应

问题&#xff1a;多个参数用websocket 向io 服务器发送变量&#xff0c;一次发一个&#xff0c;并接收响应&#xff0c;如果是多个变量&#xff0c;但还是需要一个个发送&#xff0c;应该怎么实现&#xff0c;思路是什么样子的呢&#xff1f;用数组的话&#xff0c;应该怎么用&…

Flink-05学习 接上节,将FlinkJedisPoolConfig 从Kafka写入Redis

上节成功实现了FlinkKafkaConsumer消费Kafka数据&#xff0c;并将数据写入到控制台&#xff0c;接下来将继续将计算的结果输入到redis中。 pom.xml 引入redis到pom包 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://mave…

git教程-pycharm使用tag打标签

一.生成tag标签 前言 当我们的代码完成了第一阶段的需求&#xff0c;版本稳定后&#xff0c;希望能出个稳定版本。于是在 commit 后需要打个 tag 标签&#xff0c;也就是我们平常说的版本号&#xff0c;如v1.0版本 本篇讲解如何使用 pycharm 打 tag 标签&#xff0c;并推送到…

PHP Error: 深入解析与处理技巧

PHP Error: 深入解析与处理技巧 引言 PHP作为一种广泛使用的服务器端脚本语言,在Web开发领域占据着重要地位。然而,任何编程语言都难以避免错误的发生。本文将深入探讨PHP错误处理的相关知识,包括错误类型、错误显示、错误日志以及错误处理技巧,帮助开发者更好地应对和解…

21、企业行政办公(OA)数字化转型:系统如何重塑企业高效运营新范式

企业行政办公是营造高效工作环境、提升员工幸福感和归属感的重要基石&#xff0c;更是传递组织温度与价值关怀的第一窗口。在数字化转型浪潮席卷各行各业的今天&#xff0c;企业行政办公领域正经历一场静默但深刻的变革。据统计&#xff0c;采用智能化OA系统的企业&#xff0c;…

基于开源AI智能名片链动2+1模式S2B2C商城小程序的抖音渠道力拓展与多渠道利润增长研究

摘要&#xff1a;在数字化商业竞争日益激烈的背景下&#xff0c;抖音平台凭借其庞大的流量基础和兴趣电商生态&#xff0c;成为品牌增长的关键阵地。渠道力作为品牌增长的核心驱动力&#xff0c;以抖音势能为内核&#xff0c;通过流量与销量的外溢效应&#xff0c;可显著提升品…

基于二维码的视频合集高效管理与分发技术

一、 视频资源聚合的技术挑战与解决方案 在企业培训、在线教育和产品展示等场景中&#xff0c;视频资源的结构化组织与高效分发始终是技术实现的核心挑战。传统方案往往面临三大痛点&#xff1a;资源碎片化导致的管理混乱、多视频序列播放的用户体验不佳、以及跨平台兼容性问题…

GPT-2论文阅读:Language Models are Unsupervised Multitask Learners

本文解析 OpenAI 2019 年发布的里程碑式论文&#xff0c;该论文首次提出了 GPT-2 模型&#xff0c;揭示了语言模型作为无监督多任务学习器的革命性潜力。文章的核心观点是&#xff1a;语言模型在无监督训练过程中&#xff0c;可以隐式地学习多种任务&#xff0c;无需特定任务微…

R 语言安装使用教程

一、R 语言简介 R 是一种用于统计分析、数据挖掘和可视化的编程语言和环境。它在学术界和数据分析领域中广泛使用&#xff0c;拥有丰富的统计函数库和绘图功能。 二、安装 R 语言 2.1 下载 R 安装包 前往 CRAN 官网下载适合你操作系统的安装程序&#xff1a; 官网地址&…

智能Agent场景实战指南 Day 1:智能Agent概述与架构设计

【智能Agent场景实战指南 Day 1】智能Agent概述与架构设计 引言 欢迎来到"智能Agent场景实战指南"系列的第一天&#xff01;今天我们将深入探讨智能Agent的基本概念和架构设计。在这个大模型时代&#xff0c;智能Agent已成为连接AI技术与实际业务场景的关键桥梁&am…

Plan-Grounded Large Language Models forDual Goal Conversational Settings

Plan-Grounded Large Language Models for Dual Goal Conversational Settings - ACL Anthologyhttps://aclanthology.org/2024.eacl-long.77/ 1. 概述 引导用户完成诸如烹饪或 DIY 之类的手动任务(Choi 等,2022),对于当前的大型语言模型(LLMs)来说是一个新颖且具有挑战…

python打卡day57@浙大疏锦行

知识点回顾 序列数据的处理&#xff1a; 处理非平稳性&#xff1a;n阶差分处理季节性&#xff1a;季节性差分自回归性无需处理 模型的选择 AR(p) 自回归模型&#xff1a;当前值受到过去p个值的影响MA(q) 移动平均模型&#xff1a;当前值收到短期冲击的影响&#xff0c;且冲击影…

YOLOv11性能评估全解析:从理论到实战的指标指南

深入剖析目标检测核心指标,掌握模型优化的关键密码 为什么需要性能评估指标? 在目标检测领域,YOLO系列模型以其卓越的速度-精度平衡成为行业标杆。当我们训练或使用YOLOv11模型时,一个核心问题始终存在:如何量化模型的性能? 性能评估指标正是回答这个问题的关键工具,它…

【Linux内核及内核编程】Linux2.6 后的内核特点

2003 年发布的 Linux 2.6 内核是一个里程碑&#xff0c;它标志着 Linux 从 “极客玩具” 向全场景操作系统的蜕变。如果说 2.4 内核是 Linux 进入企业级市场的起点&#xff0c;那么 2.6 及后续版本则是一场从内到外的 “现代化革命”&#xff0c;不仅让 Linux 在服务器、桌面、…

GO 语言学习 之 结构体

在 Go 语言中&#xff0c;结构体&#xff08;struct&#xff09;是一种用户自定义的数据类型&#xff0c;它可以包含多种不同类型的数据组合在一起。结构体为组织和管理相关数据提供了一种有效的方式&#xff0c;常用于表示现实世界中的对象或概念。如果你懂C/C&#xff0c;那么…

ubuntu 启动SSH 服务

在Ubuntu系统中&#xff0c;启动SSH服务需要确保SSH服务已经安装&#xff0c;并且正确配置。以下是详细步骤&#xff1a; 一、检查SSH服务是否已安装 检查SSH服务是否安装 打开终端&#xff08;Terminal&#xff09;。 输入以下命令来检查SSH服务是否已安装&#xff1a; bash…