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;准备工…