7.12 卷積 | 最小生成樹 prim

?

lc1900.模擬比賽

算出兩個指定選手最早和最晚能在第幾輪碰到。

還是建議dfs捏

?

模擬比賽,找出兩個特定選手(firstPlayer和secondPlayer)最早和最晚相遇的輪次。

1.?定義了一個“選手”結構體,包含兩個屬性a(戰斗力)和b(編號),并規定按b值排序。
2.?主函數里,根據總人數n設置模擬次數(人數越多模擬次數越多)。
3.?每次模擬時:
- 給所有選手隨機分配戰斗力,讓兩個特定選手戰斗力最高(確保他們能贏到最后相遇)。
- 模擬比賽:每輪讓第i名和第rest+1-i名選手對決,贏的留下。
- 檢查這一輪是否是兩個特定選手相遇,記錄最早和最晚的輪次。
4.?最后返回這兩個記錄的輪次。

簡單說就是通過多次模擬比賽,算出兩個指定選手最早和最晚能在第幾輪碰到。

struct node
{
int a , b;
bool operator <(const node &p)
{
return b < p.b;
}
}player[30];

?

class Solution {
public:
vector<int> earliestAndLatest(int n, int firstPlayer, int secondPlayer)?
{
srand(time(NULL));

? ? ? ? // 根據n的大小設置模擬次數
int N;
if(n <= 10)
N = 800;
else if (n <= 20)
N = 8000;
else N = 38000;

? ? ? ? int ans1 = 9999 , ans2 = 0 , rest , now;

while(N--)
{
// 剩余的運動員
rest = n;

? ? ? ? ? ? // 初始化戰斗力
for(int i = 1 ; i <= n ; i++)
{
player[i].a = rand() % 1075943;
player[i].b = i;
}
player[firstPlayer].a = 11000000;
player[secondPlayer].a = 10999999;

// 統計輪次
now = 1;

// 模擬比賽
while(rest > 1)
{
for(int i = 1 ; i <= rest / 2 ; i++)
{
if(player[i].a < player[rest + 1 - i].a)
player[i] = player[rest + 1 - i];

? ? ? ? ? ? ? ? ? ? // 統計firstPlayer和secondPlayer相遇輪次的最大值和最小值
if(player[i].b == firstPlayer && player[rest + 1 - i].b == secondPlayer)
ans1 = min(ans1 , now) , ans2 = max(ans2 , now);
}
now++;
rest = (rest + 1) / 2;
sort(player + 1 , player + rest + 1);

}
}
vector<int> ans = {ans1 , ans2};
return ans;

? ? }
};

dfs

class Solution {
bitset<1 << 15> m;
int the_max = 0, the_min = INT_MAX;

? ? void dfs(int serial, int n, int firstPlayer, int secondPlayer) {
int mask = (n << 10) + (firstPlayer << 5) + secondPlayer;
int ff = n - firstPlayer + 1, fs = n - secondPlayer + 1;
if (ff == secondPlayer) {
the_max = max(the_max, serial);
the_min = min(the_min, serial);
return;
}
if (m[mask]) return;
m.set(mask);

? ? ? ? int arr[] {firstPlayer, secondPlayer, ff, fs};
sort(arr, arr + 4);
int f_index = lower_bound(arr, arr + 4, firstPlayer) - arr;
int s_index = lower_bound(arr, arr + 4, secondPlayer) - arr;
for (int i = 0; i < arr[0]; ++i) {
for (int j = 0; j < arr[1] - arr[0]; ++j) {
int fi = arr[0] - 1 - i;
int fj = arr[1] - arr[0] - 1 - j;
int mid = (arr[2] - arr[1]) / 2;

? ? ? ? ? ? ? ? int val[] { i, i + j, i + j + mid, i + j + mid + fj };

? ? ? ? ? ? ? ? if (f_index == 0 && s_index == 1) {
dfs(serial + 1, (n + 1) / 2, val[0] + 1, val[1] + 2);
} else if (f_index == 2 && s_index == 3) {
dfs(serial + 1, (n + 1) / 2, val[2] + 1, val[3] + 2);
} else if (f_index == 0 && s_index == 2) {
dfs(serial + 1, (n + 1) / 2, val[0] + 1, val[2] + 2);
} else {
assert(f_index == 1 && s_index == 3);
dfs(serial + 1, (n + 1) / 2, val[1] + 1, val[3] + 2);
}
}
}
}

public:
vector<int> earliestAndLatest(int n, int firstPlayer, int secondPlayer) {
dfs(1, n,firstPlayer, secondPlayer);
return { the_min, the_max };
}
};

計算兩個特定選手(firstPlayer和secondPlayer)在比賽中最早和最晚相遇的輪次。

1.?用深度優先搜索(dfs)模擬比賽過程,不是真的比勝負,而是追蹤兩個選手的位置變化。

2.?每次遞歸代表一輪比賽,選手按規則配對后,勝者進入下一輪,位置會重新排列。

3.?代碼通過記錄狀態(當前總人數、兩個選手的位置)避免重復計算,高效找出兩人相遇的最早和最晚輪次。

簡單說,就是用遞歸模擬每一輪比賽,追蹤兩個指定選手的位置變化,最終得出他們最早和最晚能碰上的輪次。

?

找回自信dp

class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int n=cost.size();
//初始化一個dp表
vector<int> dp(n+1,0);
//初始化
dp[0]=dp[1]=0;
//填表
for(int i=2;i<n+1;i++)
//根據狀態轉移方程得
dp[i]=min(cost[i-1]+dp[i-1],cost[i-2]+dp[i-2]);
//一步兩步當中,勇敢取小
return dp[n];

? ? }
};

?


在 C++ 中, queue ?可以存儲 vector ,因為 queue ?是一種容器適配器,它可以容納任何符合要求的元素類型,包括標準容器(如 vector )。

accumulate()累加求和

accumulate ?是 C++ 標準庫 <numeric> ?里的一個實用工具,專門用來做累加求和

accumulate(vec開始位置, vec結束位置, 0);

eg.(nums.begin(),nums.end(),0)

?

最小成本的聯通所有點

兩個算法的相同點:每次都是加min 邊


?prim? 加點法? if(未加點 && 最小邊)

每次選最近的村子修路,修好再看其他村子經新路會不會更近,

?kruskal 加邊法? if(未連通 && 最小邊)

?

lc1584.連接所有點

?解決“連接所有點的最小費用”問題的,用Prim算法(一種求最小生成樹的算法)

核心思路

把點想象成“城市”,連接點的費用是“修路成本”,目標是用最少成本把所有城市連通。

Prim算法的思路是**“貪心”**:從一個起點出發,每次選當前離已連通區域最近的新城市,把它連進來,直到所有城市連通。

代碼

class Solution {
public:
int minCostConnectPoints(vector<vector<int>>& points) {
// 定義一個極大值,代表初始“無限遠”的距離
const int inf = INT_MAX;?

int n = points.size();?
int ans = 0;?
// 標記點是否已加入“已連通區域”(城市是否已連通)
vector<bool> visited(n,false);?
// 記錄每個點到“已連通區域”的最小距離(每個城市到當前連通區的最低修路成本)
vector<int> dist(n,inf);?
// 選第一個點當起點,它到自己的距離是0(自己和自己連通不要錢)
dist[0] = 0;?

? ? ? ? // 要把n個點都連通,循環n次(每次連一個新點)
for(int i = 0; i < n;i++){?
// 找當前離“已連通區域”最近的點(找最低成本的城市)
int u = -1;?
for(int j = 0;j < n;j ++){
// 沒訪問過,且是當前找到的距離最小的點
if(!visited[j]&&(u ==-1||dist[u] > dist[j])){?
u = j; // 選中這個點

}
}
// 把這個點標記為“已連通”(加入修路計劃)
visited[u] = true;?

? ? ? ? ? ? // 更新其他未連通點到“已連通區域”的最小距離
for(int j =0; j < n; j++){
if(!visited[j]){?
// 計算當前點u和點j的曼哈頓距離(修路成本)
int newDist = abs(points[j][0]-points[u][0]) + abs(points[j][1]-points[u][1]);?
// 如果經u連接更便宜,就更新“j到連通區的最小成本”
dist[j] = min(dist[j],newDist);?
}
}
}
// 把所有“最小距離”加起來,就是總費用(總修路成本)
return accumulate(dist.begin(),dist.end(),0);?
}
};




1.?初始化:選第一個點當起點,記錄每個點到“已連通區”的距離(初始時只有起點自己,所以起點距離是0,其他是“無限遠”)。
2.?選最近點:每次從“未連通”的點里,挑離“已連通區”最近的點,把它加入連通區。
3.?更新距離:加入新點后,重新算其他未連通點到“新連通區”的距離(因為可能經新點連接更便宜)。
4.?算總費用:把所有點到連通區的最小距離加起來,就是連通所有點的最小總費用。

就像“修路包工頭”,每次選最近的村子修路,修好再看其他村子經新路會不會更近,最后把修路的錢全加起來,就是最省錢的方案~

?

?

lc2428.沙漏

可以固定左上角的點枚舉,也可以用3*3卷積

更完善一點的,可以開辟空間

存儲每個3x3區域的計算結果
vector<vector<int>> nums(m - 2, vector<int>(n - 2, 0));

?

class Solution {

public:

? ? int maxSum(vector<vector<int>>& grid) {

? ? ? ? int m = grid.size(), n = grid[0].size();

? ? ? ? int ret=0;

? ? ? ? // 定義十字形卷積核, 處理映射

? ? ? ? vector<vector<int>> Kernel = {{1,1,1}, {0,1,0}, {1,1,1}};

? ? ? ??

? ? ? ? for (int i = 0; i <= m - 3; ++i) {

? ? ? ? ? ? for (int j = 0; j <= n - 3; ++j) {

? ? ? ? ? ? ? ? int sum=0;

? ? ? ? ? ? ? ? for (int k = 0; k < 3; ++k) {

? ? ? ? ? ? ? ? ? ? for (int l = 0; l < 3; ++l) {

? ? ? ? ? ? ? sum += grid[i + k][j + l] * Kernel[k][l];

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ret=max(ret,sum);

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? return ret;

? ? }

};

?

對稱二叉樹

class Solution {

public:

? ? bool isSymmetric(TreeNode* root)?

? ? {

? ? ? ? if(!root) return true;

? ? ? ? return com(root->left,root->right);

? ? }

? ??

? ? bool com(TreeNode* left,TreeNode* right)

? ? {

? ? ? //對稱

? ? ? ? if(!left && !right)

? ? ? ? ? ? return true;

? ? ? ? if(!left ||!right)

? ? ? ? ? ? return false;

? ? ? ? return (left->val==right->val)

? ? ? ? && com(left->left,right->right)

? ? ? ? && com(left->right,right->left);

? ? }

};

?

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

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

相關文章

LVS-NAT模式配置

目錄 1、負載調度器配置 配置IP地址 安裝ipvsadm 開啟路由轉發功能 加載ip_vs模塊 啟動ipvsadm服務 配置負載分配策略 查看驗證 2、web節點配置 3、測試 1、負載調度器配置 配置IP地址 增加一塊網卡 cd /etc/sysconfig/network-scripts/ cp ifcfg-ens192 ifcfg-ens…

中國銀聯豪擲1億采購海光C86架構服務器

近日&#xff0c;中國銀聯國產服務器采購大單正式敲定&#xff0c;基于海光C86架構的服務器產品中標&#xff0c;項目金額超過1億元。接下來&#xff0c;C86服務器將用于支撐中國銀聯的虛擬化、大數據、人工智能、研發測試等技術場景&#xff0c;進一步提升其業務處理能力、用戶…

web網頁,在線%食譜推薦系統%分析系統demo,基于vscode,uniapp,vue,java,jdk,springboot,mysql數據庫

經驗心得兩業務單,項目前端在VSCode、HBuilder環境下整合Uniapp、Vue。后端使用Java、SpringBoot和MySQL&#xff0c;使用這些技術棧咱們就可以搭建在線食譜推薦與分析功能的系統&#xff0c;技術棧雖涉及前后端及數據庫跨度不小&#xff0c;但咱們拆分模塊去開發它難度就會變小…

MCP架構:AI時代的標準化上下文交互協議

本文深入解析Model Context Protocol&#xff08;MCP&#xff09;架構的創新設計&#xff0c;這是一種由Anthropic提出的標準化協議&#xff0c;旨在解決大型語言模型&#xff08;LLM&#xff09;與外部工具和數據源交互的碎片化問題。MCP采用客戶端-服務器架構&#xff0c;通過…

機器學習數據集加載全攻略:從本地到網絡

目錄 一、加載內置數據集 1.1 Iris鳶尾花數據集 1.2 其他常用內置數據集 二、加載網絡數據集 2.1 20 Newsgroups數據集 三、加載本地數據集 3.1 使用pandas加載CSV文件 3.2 處理常見問題 四、數據加載最佳實踐 五、總結 在機器學習項目中&#xff0c;數據的加載是第一…

【操作系統】進程(二)內存管理、通信

JavaEE—進程(二)內存管理、通信 一、內存管理 1.映射訪問 2.獨立分布 防崩潰 二、通信 1.獨立性保障 2.方式 2.1管道 2.1.2特點 2.1.2.1進程條件 2.1.2.2方向 2.1.2.3同步性 2.1.2.4性能 2.2消息隊列 2.2.1特點 2.2.1.1方向 2.2.1.2同步性 2.2.1.3性能 2.3…

windows 裝了 python2 和 python3 如何切換默認版本

現在執行 python --version 是Python 3.11.3怎么讓 python 默認是 python2&#xff0c;而 python3 --version 是執行 pyhon3 呢cmd 執行 where pythonC:\Users\huyun\AppData\Local\Programs\Python\Python311-32\python.exe C:\Users\huyun\AppData\Local\Microsoft\WindowsAp…

二次封裝element ui pagination組件

vue2中二次封裝element ui pagination組件 html部分 <template><div class"table-pagination"><el-pagination:current-page.sync"currentPage":page-sizes"pageSizes":page-size"pageSize":layout"paginationLay…

SAP學習筆記 - 開發39 - RAP開發 BTP /DMO 官方既存測試數據的使用

上一章講了 RAP開發流程的具體步驟&#xff0c;建表 》建Data Model View 》建 Projection View 》建Service Definition 》 建Service Binding 》Publish 服務。 SAP學習筆記 - 開發37 - RAP開發流程的具體步驟&#xff0c; 建表&#xff0c;Data Model View&#xff0c;Proj…

SQLite - C/C++ 開發與應用詳解

SQLite - C/C++ 開發與應用詳解 引言 SQLite 是一個輕量級的數據庫引擎,它被設計成不需要服務器進程就可以獨立運行。SQLite 在 C/C++ 開發領域具有廣泛的應用,由于其體積小、性能高、易于集成等優點,深受開發者的喜愛。本文將詳細介紹 SQLite 在 C/C++ 開發中的應用,包括…

蔚來測開一面:HashMap從1.7開始到1.8的過程,既然都解決不了并發安全問題,為什么還要進一步解決環形鏈表的問題?

文章目錄問題的根源&#xff1a;JDK 1.7 的設計缺陷為什么必須解決這個問題&#xff1f;1\. 故障等級完全不同 &#x1f4a3;2\. JDK 1.8 的解決方案&#xff1a;一石二鳥 &#x1f985;3\. 為“不小心”的開發者提供一層保障 &#x1f6e1;?結論這是一個非常好的問題&#xf…

AI技術正以前所未有的速度重塑職業生態與行業格局,尤其在自動化測試領域,AI驅動的測試框架通過智能化、低代碼化重構傳統測試流程。

AI技術正以前所未有的速度重塑職業生態與行業格局&#xff0c;尤其在自動化測試領域&#xff0c;AI驅動的測試框架通過智能化、低代碼化重構傳統測試流程。以下從職業影響、技術架構、行業應用及應對策略四個維度展開分析&#xff0c;結合代碼示例與框架設計圖解&#xff1a;一…

在 Mac 上安裝 Java 和 IntelliJ IDEA(完整筆記)

目錄 檢查是否已安裝 Java安裝 Java&#xff08;JDK&#xff09;設置 JAVA_HOME 環境變量安裝 IntelliJ IDEA配置 IntelliJ IDEA 使用 JDK驗證和測試環境是否成功 1. 檢查是否已安裝 Java 打開終端&#xff08;Terminal&#xff09;&#xff0c;輸入&#xff1a; java -vers…

基于Java+Maven+Testng+Selenium+Log4j+Allure+Jenkins搭建一個WebUI自動化框架(2)對框架加入業務邏輯層

在上篇中&#xff0c;我們已經搭建好了框架的基本雛形&#xff0c;但只是引入了頁面層、用例層的思想&#xff0c;我們在實際使用中會發現&#xff0c;如果我們很多的用例需要很多前置工作&#xff0c;這些前置工作又有可能涉及到多個頁面&#xff0c;那么我們在維護的時候就會…

uniapp ruoyi-app 中使用checkbox 無法選中問題

<view class"flex align-center"> <checkbox-group> <label> <checkbox value"cb" checked"true" /> 記住密碼 </label> </checkbox-group> </view>colorui.css 文件中注釋掉兩處即可全局搜索…

如何快速學習GO語言

https://go.dev/tour/welcome/1 這個是官方的引導&#xff0c;很實用基本重點內容都涵蓋了&#xff0c;并且可以一邊學習一邊練習&#xff0c;非常好用 簡單介紹一下&#xff1a; Hello, 世界 歡迎訪問 Go 編程語言教程。 本教程分為幾個模塊&#xff0c;點擊本頁左上角的 …

AI 產品經理必看:神秘技術架構圖如何打通跨團隊溝通壁壘?

? 你好&#xff0c;我是 三橋君 引言 在AI產品的開發過程中&#xff0c;技術架構圖是連接業務需求與技術實現的橋梁。然而&#xff0c;許多AI產品經理常常面臨以下挑戰&#xff1a;研發團隊認為需求描述不清晰&#xff0c;業務團隊與技術團隊溝通不暢&#xff0c;技術選型時…

【科研繪圖系列】R語言繪制解剖圖

文章目錄 介紹加載R包數據下載導入數據數據預處理畫圖系統信息參考介紹 【科研繪圖系列】R語言繪制解剖圖 加載R包 # install.packages("devtools") # library(devtools) # devtools::install_github("jespermaag/gganatogram")library(gganatogram) li…

【unity編輯器開發與拓展EditorGUILayoyt和GUILayoyt】

EditorGUILayout 與 GUILayout 的核心區別及使用場景詳解 一、對比表特性GUILayoutEditorGUILayout命名空間UnityEngineUnityEditor使用場景運行時 UI 編輯器擴展僅限編輯器擴展控件風格基礎游戲風格&#xff08;無編輯器優化&#xff09;原生 Unity 編輯器風格布局復雜度基礎…

【數據結構】8. 二叉樹

文章目錄一、樹的概念及結構1、樹的概念2、樹的相關概念3、樹的表示4、樹的實際運用二、二叉樹的概念及結構1、二叉樹的概念2、特殊的二叉樹3、二叉樹的性質4、二叉樹的存儲結構三、二叉樹的順序結構及實現1、二叉樹的順序結構2、堆的概念及結構3、堆的實現0&#xff09;準備工…