2025—暑期訓練一

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…