2024.5.28晚訓題解

提前預告,市賽初中組會考算法題,應該會有兩道模板題
比如DFS BFS 二分 簡單動態規劃,雖然我們沒學多久,但是模板題你還是要會寫的

A題 編輯距離 動態規劃
注意多組輸入

#include<iostream>
using namespace std;
int dp[1005][1005];
//dp[i][j]把s字符串的前i個經過一系列操作變成b字符串的前j個的最小代價 
char s[1005];
char b[1005];
int main(){int n,m;while(scanf("%d%s%d%s",&n,s+1,&m,b+1)!=EOF){for(int i=0;i<=m;i++){dp[0][i]=i; //插入 }for(int i=0;i<=n;i++){dp[i][0]=i; //刪除 }for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(s[i]==b[j])dp[i][j]=dp[i-1][j-1];//此時i j位置相同,可以直接從s[i-1]->b[j-1] 轉移過來else{dp[i][j]=min(dp[i-1][j-1]+1,min(dp[i-1][j]+1,dp[i][j-1]+1));/*dp[i-1][j]+1 表示我們把s[1~i] 刪掉i位置,得到s[1~i-1]  從它變到b[1~j]  dp[i][j-1]+1 表示我們把s[1~i]  從它變到b[1~j-1]  然后插入一個b[j] dp[i-1][j-1]+1    從s[1~i-1]  從它變到b[1~j-1]   對于s[i] 直接修改為b[j]   */} }}printf("%d\n",dp[n][m]);}return 0;
}

B題 最長上升子序列 (N^2)版本

#include<iostream>
using namespace std;
int A[1005];
int dp[1005]; //dp[i]表示以A[i]結尾的最長上升子序列元素 
int main(){int n;scanf("%d",&n);int ans=1;for(int i=1;i<=n;i++){dp[i]=1;scanf("%d",&A[i]);for(int j=i-1;j>=1;j--){if(A[j]<A[i]){dp[i]=max(dp[i],dp[j]+1);}}//考慮拼接的方法,想尋得dp[i],往前面找,跟某個元素拼接起來  形成以A[i]//結尾的上升子序列,那么所有的子序列取max也就是最大的   ans=max(ans,dp[i]);//但是答案不一定是以A[n]結尾  }printf("%d",ans);return 0;
}

當然,其實還有優化寫法,利用二分,即可實現NlogN 的時間復雜度
我建議還是背一下(理解一下)
代碼不是完全的,請看看思路

ll dp[N];
ll a[N];
ll b[N];
signed  main() {ll n;read(n);for(int i=1; i<=n; i++) {read(a[i]);}ll cnt=0;for(int i=1; i<=n; i++) {if(cnt==0||a[i]>dp[cnt]) {dp[++cnt]=a[i];//首位置要放入元素//如果當前元素A【i】比當前序列結尾的還要大,放進來  上升 continue;} else {//如果當前元素A[i]≤ 序列結尾  //考慮查找序列里面合適的值,替換掉 //舉例  1 100 2   //實際上用2替換100會更優,因為你過程的元素越大,越不利于后續上升dp[upper_bound(dp+1,dp+1+cnt,a[i])-dp]=a[i];}}printf("%lld",cnt);
}

右邊的數字即全球通過人數
在這里插入圖片描述

C題題解
我覺得這是不能錯的題。 1 ? 1 1*1 1?1的格子不用說了,啥地方都能放
主要看 2 ? 2 2*2 2?2的,一個板只能放最多兩個 2 ? 2 2*2 2?2
所以你要先計算出放 b b b 2 ? 2 2*2 2?2的要多少板 ,以及這些板還有多少個格子沒放的。
如果多余沒放的格子足夠放完 a a a 1 ? 1 1*1 1?1的 ,那么答案就是 2 ? 2 2*2 2?2需要的板子數
否則你還需要用(a-多余格子) 這么多個格子去計算還需要多少塊板

#include<bits/stdc++.h>
using namespace std;
int main(){int t;scanf("%d",&t);while(t--){int a,b;	scanf("%d%d",&a,&b);	int le=0;if(b%2==0)le=(15-8)*(b/2);if(b%2){le=(15-8)*(b/2)+15-4;}int ans=b/2+b%2;if(a<=le)printf("%d\n",ans);else{printf("%d\n",ans+(a-le)/15+((a-le)%15!=0));	}}return 0;
}

D題題解
這其實就是個簡單的模擬題,你把輸入的字符串字母sort一遍,把密碼表處理出來
然后枚舉字符串開始翻譯就行了

#include<bits/stdc++.h>
using namespace std;
char s[200005];
char b[30];
bool vis[30];
char sw[30];
int main(){int t;scanf("%d",&t);while(t--){memset(vis,false,sizeof(vis));int n;scanf("%d",&n);scanf("%s",s+1);int len=0;for(int i=1;i<=n;i++){if(vis[s[i]-'a'])continue;else{vis[s[i]-'a']=true;b[++len]=s[i];}}sort(b+1,b+1+len);for(int i=1;i<=len/2+1;i++){sw[b[i]-'a']=b[len-i+1];sw[b[len-i+1]-'a']=b[i];}for(int i=1;i<=n;i++){s[i]=sw[s[i]-'a'];}printf("%s\n",s+1);}return 0;
}

E題題解
這個標記題需要一定數理知識
對于一個三元組 A [ i ? 2 ] , A [ i ? 1 ] , A [ i ] {A[i-2],A[i-1],A[i]} A[i?2],A[i?1],A[i] 我們得標記它們,你可以想象一下,什么樣的三元組能相互之間算答案?有兩個元素一樣對不對,我們直接把一樣的元素標記起來,記為一個二元組。

以此標記該三元組里面的二元組,按順序標記
每次計算答案的時候,查找一下當前三元組前面,有多少個跟自己的二元組一樣的三元組,該操作不保證過濾了重復元素
因此我們需要查詢該三元組前面有多少個跟自己一模一樣的三元組,因為一模一樣是不會產生答案的,所以要減去3倍

#include<bits/stdc++.h>
using namespace std;
int A[200005];
map<pair<int,int>,int >vis_1;
map<pair<int,int>,int >vis_2;
map<pair<int,int>,int >vis_3;
map<pair<pair<int,int>,int> ,int >pre;
int main(){int t;scanf("%d",&t);while(t--){int n;scanf("%d",&n);long long int ans=0;for(int i=1;i<=n;i++){scanf("%d",&A[i]);if(i>=3){//    當前三元組A[i-2] A[i-1] A[i] //  三種可能: A[i-2]A[i]相等   A[i-1]A[i]相等   A[i-2]A[i-1]相等  這三個二元組可以作為標記去查詢ans=ans+vis_1[make_pair(A[i-2],A[i-1])];//統計前面有多少個跟A[i-2] A[i-1]值一樣的二元組(先不考慮前面存在跟自己完全一樣的三元組,那么答案就是加這個二元組標記的個數,視作前面出現的該二元組的元素與當前A[i]都不一樣)//A[i-2] A[i-1]   ?        前面的一些三元組結構//A[i-2] A[i-1] A[i]       當前三元組    ans=ans+vis_2[make_pair(A[i-2],A[i])];ans=ans+vis_3[make_pair(A[i-1],A[i])];	vis_1[make_pair(A[i-2],A[i-1])]++;vis_2[make_pair(A[i-2],A[i])]++;vis_3[make_pair(A[i-1],A[i])]++;ans=ans-3*pre[make_pair(make_pair(A[i-2],A[i-1]),A[i])];//考慮存在重復的問題,舉例//如果前面有x個三元組滿足值與當前三元組(A[i-2],A[i-1],A[i])一樣,那么我們就多計算了x個答案,因為完全相等的三元組不產生答案貢獻,枚舉了三個二元組,所以減法要減去*3  pre[make_pair(make_pair(A[i-2],A[i-1]),A[i])]++;}}printf("%lld\n",ans);vis_1.clear();vis_2.clear();vis_3.clear();pre.clear();}return 0;
}

F題題解
考慮東西南北指令,劃分為兩部分
一個部分是: 北南湊一對,相當于抵消移動 東西湊一對,相當于抵消移動

第一部分完成后,未湊對的剩下來的只能是北/南里面的一種,剩下的我們要考慮能不能均分給兩個人,同理東西

計算北南的對數,東西的對數
北南可以按A人先的順序輪流分配
東西可以按B人先的順序輪流分配
接下來分配剩余的未配對的,注意如果剩余奇數個,肯定不能保證最終兩個人走在同一個地方

#include<bits/stdc++.h>
using namespace std;
char s[200005];
int vis[30];
int A[30];
int B[30];
int main(){int t;scanf("%d",&t);int N,S,E,W;N='N'-'A';S='S'-'A';E='E'-'A';W='W'-'A';while(t--){int n;scanf("%d",&n);scanf("%s",s+1);vis[N]=vis[S]=vis[E]=vis[W]=0;A[N]=A[S]=A[E]=A[W]=0;B[N]=B[S]=B[E]=B[W]=0;for(int i=1;i<=n;i++){vis[s[i]-'A']++;}int ns=min(vis[N],vis[S]);int ew=min(vis[E],vis[W]);//配對相消  int lens=max(vis[N],vis[S])-min(vis[N],vis[S]);int leew=max(vis[E],vis[W])-min(vis[E],vis[W]); for(int i=1;i<=ns;i++){if(i%2){A[N]++;A[S]++;}else{B[N]++;B[S]++;}}for(int i=1;i<=ew;i++){if(i%2){B[E]++;B[W]++;}else{A[E]++;A[W]++;}}//雙消+偶數//單消 + 偶 if(lens%2||leew%2){printf("NO\n");}else{int op;if(vis[N]>vis[S])op=N;else op=S;A[op]+=lens/2;B[op]+=lens/2;if(vis[E]>vis[W])op=E;else op=W;A[op]+=leew/2;B[op]+=leew/2;if((A[N]+A[S]+A[E]+A[W])==0||(B[N]+B[S]+B[E]+B[W])==0){printf("NO\n");continue;}	for(int i=1;i<=n;i++){if(A[s[i]-'A']){A[s[i]-'A']--;printf("R");}else{B[s[i]-'A']--;printf("H");}}printf("\n");}}return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/18230.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/18230.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/18230.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

9、C#【進階】特性

特性 文章目錄 1、特性概念2、自定義特性 Attribute3、特性的使用4、限制自定義特性的使用范圍5、系統自帶特性1、過時特性2、調用者信息特性3、條件編譯特性4、外部dll包函數特性 1、特性概念 特性是一種允許我們向程序的程序集添加元數據的語言結構 它是用于保存程序機構信息…

【機器學習300問】103、簡單的經典卷積神經網絡結構設計成什么樣?以LeNet-5為例說明。

一個簡單的經典CNN網絡結構由&#xff1a;輸入層、卷積層、池化層、全連接層和輸出層&#xff0c;這五種神經網絡層結構組成。它最最經典的實例是LeNet-5&#xff0c;它最早被設計用于手寫數字識別任務&#xff0c;包含兩個卷積層、兩個池化層、幾個全連接層&#xff0c;以及最…

ansible批量漏洞升級openssh版本

1、ansible宿主機準備好環境&#xff0c;并寫好hosts文件 [rootoxidized ansible]# cat hosts [all] 10.10.200.33 10.10.200.34 10.10.200.35跑playbook之前記得提前發送秘鑰 ssh-copy-id 10.10.200.33/34/352、下載好安裝包&#xff0c;然后編寫yml [rootoxidized ansible]…

【實用的 IDEA 配置和操作技巧總結】

前置知識 IDEA的設置快捷鍵為ctrlalts鍵&#xff0c;后文介紹IDEA常見的配置就不再贅述這一點了。 基礎配置 取消默認打開上次項目 日常開發都會打開不同的項目&#xff0c;初次安裝IDEA之后&#xff0c;每次打開IDEA都會開啟上一次啟動的項目&#xff0c;所以我們需要進入設…

0基礎學習Mybatis系列數據庫操作框架——Mysql的Geometry數據處理之WKB方案

大綱 序列化反序列化完整TypeHandlerSQL XML完整XML Mapper測試代碼代碼 在《0基礎學習Mybatis系列數據庫操作框架——Mysql的Geometry數據處理之WKT方案》中&#xff0c;我們介紹WTK方案的優點&#xff0c;也感受到它的繁瑣和缺陷。比如&#xff1a; 需要借助ST_GeomFromText…

element+ 引入圖標報錯 Failed to resolve import “@element-plus/icons-vue“ from “

element 引入圖標報錯 Internal server error: Failed to resolve import “element-plus/icons-vue” from “src\components\TimeLine.vue”. Does the file exist? 原因&#xff1a;element-plus需要單獨引入 icons 文檔 pnpm install element-plus/icons-vue之后就可以…

350種類型、10W+量級的API,企業應該怎么管?

忽如一夜春風來&#xff0c;萬物皆可API。 在互聯網時代&#xff0c;API無處不在&#xff1a;企業對外開放的數據、服務和業務能力&#xff0c;以API的形式提供給合作方&#xff1b;企業內部應用與應用、App與App之間的通信&#xff0c;通過API進行&#xff1b;甚至應用內部的…

php 連接sqlserver步驟

1.首先要確定使用的是sqlserver的哪個版本&#xff0c;比如sqlserver2012 2.確定服務器是64位還是32位的 3.確認一下使用php的哪個版本&#xff0c;比如php7.1 SQL Server 的 Microsoft PHP 驅動程序 Microsoft Drivers for PHP 支持矩陣 - PHP drivers for SQL Server | Mi…

Flutter 中的 CupertinoTabView 小部件:全面指南

Flutter 中的 CupertinoTabView 小部件&#xff1a;全面指南 在 Flutter 中&#xff0c;CupertinoTabView 是 Cupertino 組件庫中的一個 widget&#xff0c;它用于創建 iOS 風格的標簽頁視圖。這個 widget 通常與 CupertinoTabScaffold 結合使用&#xff0c;提供了一個底部帶有…

怎么做好客戶信息管理?

根據Forrester的調查表示&#xff0c;客戶滿意度的影響可能會使某些行業的收入每年增加高達 10 億美元。而提升客戶滿意度的關鍵環節便是做好客戶信息管理。但企業在進行客戶信息管理中往往會遇到以下問題&#xff1a; 客戶信息亂&#xff1a;客戶信息存在各個 Excel表格、個人…

PMP報考條件怎么查詢?如何判定自己是否符合條件?

PMP報考條件在PMI官網上就可以查詢&#xff0c;PMP報考條件只需要符合項目管理培訓經歷和項目管理經驗兩個方面的要求即可&#xff0c;大家可以對照下方的規定判斷自己是否符合PMP報名條件 PMP報考條件 以下是PMI&#xff08;中國&#xff09;官網對于PMP報名條件的規定&…

優秀的數據分析師需要具備哪些?

在數據驅動的時代&#xff0c;數據分析師的角色越來越被重視。本文將探討優秀數據分析師必備的三大核心能力&#xff0c;并通過實際案例說明如何將這些能力轉化為業務價值&#xff0c;幫助你在職業道路上更進一步。 在數字化迅速發展的今天&#xff0c;數據分析師扮演著極其重要…

ubuntu strace命令

strace 是 Linux 系統中的一個調試工具&#xff0c;用于跟蹤并記錄系統調用&#xff08;system calls&#xff09;和信號&#xff08;signals&#xff09;。在 Ubuntu 中&#xff0c;strace 命令可以幫助開發者和系統管理員了解一個程序在運行時如何與操作系統內核進行交互&…

TypeScript常見面試題第八節

題目三十六:什么是參數解構? 一、講解視頻 TS面試題三十六:什么是參數解構? 二、題目解析 本題目考察 ts 中的解構,解構是一種特殊語法,可以將對象解構到一個或多個局部變量中,可展開操作符相反,展開是允許將一個數組展開為另一個數組,或將一個對象展開為另一個對象,…

vue+antd實踐:在輸入框光標處插入內容

今天來看一個很簡單的需求。 需求描述&#xff1a;在輸入框光標處&#xff0c;插入指定的內容。 效果如下&#xff1a; 實現思路&#xff1a;剛開始還在想怎么獲取光標的位置&#xff0c;但是發現所做的項目是基于vue3antd組件&#xff0c;那么不簡單了嘛&#xff0c;只要調…

JAVA自制小游戲之推箱子

給家里孩子實現益智游戲開發,教會他怎么使用編程。以下是一個簡單的推箱子游戲的Java實現,包含兩個關卡: 這個程序包含兩個關卡,每個關卡都是一個字符串表示的地圖。游戲會提示玩家輸入移動方向(WASD),然后根據輸入的方向移動玩家。如果玩家成功將所有的箱子推到目標位…

配置物聯網平臺 保姆級教程

一、云平臺配置&#xff08;我們這里使用阿里云&#xff09; 1、注冊和登錄 &#xff08;1&#xff09;找到云平臺官網&#xff0c;點擊右上角的注冊登錄&#xff0c;完成之后&#xff0c;進行實名認證&#xff0c;任選一種認證方式。 ??????? 2、實例的開通和創建 …

Scala環境的搭建

要搭建Scala&#xff0c;我們必須先下載java&#xff0c;由于我的電腦已經搭建好了環境&#xff0c;因此我這里用截圖來教大家搭建環境。 可以從網上搜索安裝包對其進行安裝 IntelliJ IDEA – 領先的 Java 和 Kotlin IDE 不建議下載最新版的&#xff0c;大家下載的版本可以下…

本殺小程序開發實戰手冊:從構思到上線

一、引言 隨著移動互聯網的快速發展&#xff0c;劇本殺作為一種新興的娛樂方式&#xff0c;受到了越來越多年輕人的喜愛。為了滿足市場需求&#xff0c;開發一款劇本殺小程序成為了許多創業者和開發者的選擇。本文將從構思、設計、開發到上線等方面&#xff0c;為您詳細解析劇…

第52期|GPTSecurity周報

GPTSecurity是一個涵蓋了前沿學術研究和實踐經驗分享的社區&#xff0c;集成了生成預訓練Transformer&#xff08;GPT&#xff09;、人工智能生成內容&#xff08;AIGC&#xff09;以及大語言模型&#xff08;LLM&#xff09;等安全領域應用的知識。在這里&#xff0c;您可以找…