LeetCode---388周赛

题目列表

3074. 重新分装苹果

3075. 幸福值最大化的选择方案

3076. 数组中的最短非公共子字符串

3077. K 个不相交子数组的最大能量值

一、重新分装苹果

注意题目中说同一个包裹中的苹果可以分装,那么我们只要关心苹果的总量即可,在根据贪心,优先选择容量大的箱子,代码如下

class Solution {
public:
    int minimumBoxes(vector<int>& apple, vector<int>& capacity) {
        int sum = accumulate(apple.begin(),apple.end(),0);
        ranges::sort(capacity);
        int n = capacity.size(), cnt = 1;
        for(int i = n - 1; i >= 0; i--){
            sum-=capacity[i];
            if(sum<=0) break;
            cnt++;
        }
        return cnt;
    }
};

二、幸福值最大化的选择方案

由于每选一个孩子,未被选择的孩子的幸福值会减一,并且幸福值减为0后就无法在减少,所以我们肯定优先选幸福值大的孩子,因为他们的幸福值能被减少的上限更高, 即在减去一定的幸福值之后,幸福值小的,可能已经为0无法减少,但是幸福值大的还能再减,所以优先选幸福值大的孩子

class Solution {
public:
    long long maximumHappinessSum(vector<int>& happiness, int k) {
        long long ans = 0;
        ranges::sort(happiness);
        int n = happiness.size();
        for(int i = 0, j = n - 1; i < k; i++, j--){
            ans += max(0,happiness[j]-i);
        }
        return ans;
    }
};

三、数组中的最短非公共子字符串

这题看着很复杂,但是我们看一眼数据范围,很小,可以直接模拟,代码如下

class Solution {
public:
    vector<string> shortestSubstrings(vector<string>& arr) {
        int n = arr.size();
        vector<string> ans(n);
        for(int i = 0; i < n; i++){
            string& s = arr[i];
            int m = s.size();
            for(int sub = 1; sub <= m; sub++){
                vector<string> v;
                for(int start = 0; start + sub - 1 < m; start++){
                    string tmp = s.substr(start,sub);
                    bool flag = true;
                    for(int j = 0; j < n; j++){
                        if(i == j) continue;
                        if(arr[j].find(tmp)!=-1){
                            flag = false;
                            break;
                        }
                    }
                    if(flag) v.push_back(tmp);
                }
                if(v.size()){
                    sort(v.begin(),v.end());
                    ans[i] = v[0];
                    break;
                }
            }
        }
        return ans;
    }
};

 四、K个不相交子数组的最大能量值

这题是个很经典的划分型dp,一般这种题的状态定义都是f[i][j]表示前i个数字分为j段的...,

这题也是同理

状态定义:f[i][j]表示前i个数字分为j段的最大能量和

转移方程:

1、如果不选择第i个数,f[ i ][ j ] = f[ i-1 ][ j ]

2、如果选择第i个数,f[ i ][ j ] = max(f[x][j-1]+(___)) ,表示 MAX( 前x个数字分为j-1段的最大能量+[x+1,i]的能量值 )     其中 ___ = (pre[i] - pre[x])*(k-j+1)*(-1)^j

3、初始化:i<j的状态都是不合理的,因为i个数字无法被分为j组,可以设置为无穷小,f[x][0]=0

代码如下

class Solution {
    //f[i][j]表示前i个分成j段的最大能量值
    //f[i][j]=max(dp[x][j-1]+(...),dp[i-1][j])
    //           选择[x+1,i]为第j段  不选第i个数
    //               j-1<=x<i
    // ... = (pre[i] - pre[x])*(k-j+1)*(-1)^j
public:
    long long maximumStrength(vector<int>& nums, int k) {
        int n=nums.size();
        long long pre[n+1];pre[0]=0;
        for(int i=0;i<n;i++) pre[i+1]=pre[i]+nums[i];
        vector<vector<long long>> f(n+1,vector<long long>(k+1));
        for(int i=1;i<=k;i++) f[i-1][i]=LLONG_MIN;// 状态转移时只会用到(i-1,i)这些非法状态,其他可以不管
        for(int i=1;i<=n;i++){
            for(int j=1;j<=min(k,i);j++){
                int w=(j&1?1:-1)*(k-j+1);
                f[i][j]=f[i-1][j];//不选
                for(int x=j-1;x<i;x++){//以[x+1,i]为第j段
                    f[i][j]=max(f[i][j],f[x][j-1]+(pre[i]-pre[x])*w);
                }
            }
        }
        return f[n][k];
    }
};

但是这样写的时间复杂度显然太高了,需要优化, 如何优化???(数学推导)

设w=(k-j+1)*(-1)^j,则___ = w*(pre[i] - pre[x]) = w*pre[i] - w*pre[x]

则f[ i ][ j ] = max(f[x][j-1]+w*pre[i] - w*pre[x]) = w*pre[i] + max(f[x][j-1] - w*pre[x])

我们会发现max(表达式)只与x和j有关并且x是从前往后遍历的,也就是说我们只要保持j不变,那么max(表达式)就是求该表达式的前缀最大值,不需要每次循环都来算,那么关键在于如何保持j不变,这个其实也很简单,只要交换i和j的循环顺序即可,即外层循环为j,内层循环为i,代码如下

class Solution {
    //f[i][j]表示前i个分成j段的最大能量值
    //f[i][j]=max(dp[x][j-1]+(...),dp[i-1][j])
    //           选择[x+1,i]为第j段  不选第i个数
    //               j-1<=x<=i
    // ... = (pre[i+1] - pre[x])*(k-j+1)*(-1)^j
public:
    long long maximumStrength(vector<int>& nums, int k) {
        int n=nums.size();
        long long pre[n+1];pre[0]=0;
        for(int i=0;i<n;i++) pre[i+1]=pre[i]+nums[i];
        vector<vector<long long>> f(n+1,vector<long long>(k+1));
        for(int j=1;j<=k;j++){
            f[j-1][j]=LLONG_MIN;
            int w=(j&1?1:-1)*(k-j+1);
            long long mx = LLONG_MIN;
            for(int i=j;i<=n;i++){
                mx = max(mx,f[i-1][j-1]-w*pre[i-1]);
                f[i][j]=max(f[i-1][j],pre[i]*w+mx);
            }
        }
        return f[n][k];
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux Day16 I/O复用】

I/O复用 用途&#xff1a;I/O 复用能同时监听多个文件描述符。 I/O 复用虽然能同时监听多个文件描述符&#xff0c;但它本身是阻塞的。并且当多个文件描述符同时就绪时&#xff0c;如果不采取额外的措施&#xff0c;程序就只能按顺序依处理其中的每一个文件描述符&#xff0c;…

一些刷题需要用的大数据

无符号版本和有符号版本的区别就是有符号类型需要使用一个bit来表示数字的正负。 如果需声明无符号类型的话就需要在类型前加上unsigned。 整型的每一种都分为&#xff1a;无符号&#xff08;unsigned&#xff09;和有符号&#xff08;signed&#xff09;两种类型&#xff08;f…

8.测试教程-自动化测试selenium-3

文章目录 1.unittest框架解析2.批量执行脚本2.1构建测试套件2.2用例的执行顺序2.3忽略用例执行 3.unittest断言4.HTML报告生成5.异常捕捉与错误截图6.数据驱动 大家好&#xff0c;我是晓星航。今天为大家带来的是 自动化测试selenium第三节 相关的讲解&#xff01;&#x1f600…

提升企业内训效率:定制化企业培训APP开发教学

当下&#xff0c;定制化企业培训APP的开发成为提升企业内训效率的重要途径之一。接下来小编将深入讲解如何通过定制化企业培训APP来提升内训效率&#xff0c;并提供相关开发教学。 一、定制的重要性 灵活、便捷&#xff1a;定制化企业培训APP则能够使培训内容随时随地可用&…

Java代码基础算法练习-求给定3个数, 进行从小到大排序-2024.03.20

任务描述&#xff1a; 输入三个整数 x,y,z(0<x<1000&#xff0c;0<y<1000&#xff0c;0<z<1000)&#xff0c;请把这三个数由小到大输出。 任务要求&#xff1a; 代码示例&#xff1a; package march0317_0331;import java.util.Scanner;public class m24…

webpack5零基础入门-10babel的使用

Babel JavaScript 编译器。 主要用于将 ES6 语法编写的代码转换为向后兼容的 JavaScript 语法&#xff0c;以便能够运行在当前和旧版本的浏览器或其他环境中 1.安装相关包 npm install -D babel-loader babel/core babel/preset-env 2.进行相关配置 2.1第一种写法是在webp…

面向低成本线跟随机器人的PID控制器优化——文末源码

目录 介绍 测试 电子元器件 系统特征 控制器设计 位置误差的计算 比例控制 积分控制 微分控制 改进的PID控制器 测试轨迹 源码链接 本文对经典PID控制器的改进和开环控制机制的发展进行了讨论&#xff0c;以提高差动轮式机器人的稳定性和鲁棒性。为了部署该算法&am…

5G里面NR,gNB,en-gNB,ng-eNB是什么意思

不得不提一个国际组织&#xff0c;叫国际电信联盟(ITU, International Telecommunication Union)&#xff0c;简称国际电联。我们先看看国际电联的自我介绍&#xff1a; 国际电信联盟 『国际电联 (国际电信联盟) 是主管信息通信技术事务&#xff08;ICT&#xff09;的联合国机…

26-分支和循环语句_循环练习(上)

写代码的思路&#xff1a; 办法&#xff08;编程思维&#xff09;写代码&#xff08;按照语法形式写&#xff09; 编程思维&#xff1a;需要慢慢训练 1、计算n的阶乘 代码1&#xff1a; int main(){int i 1;int n 0;scanf("%d", &n);int ret 1;do{retret…

MyBatis核心配置文件:解锁数据之美的密码

MyBatis&#xff0c;这位编程的诗人&#xff0c;通过其独特的核心配置文件&#xff0c;为我们描绘出一幅数据之美的画卷。本篇博客将带你深入探讨MyBatis核心配置文件的奥秘&#xff0c;让你能够更好地理解和运用这个优雅的数据持久化框架。 最近想搞私域&#xff0c;欢迎各位…

Windows创建Linux虚拟环境-WSL

使用工具WSL 官方安装使用文档 安装 WSL | Microsoft Learn 开始通过 WSL 使用 VS Code | Microsoft Learn 具体过程 1. cmd以“管理员身份运行”&#xff0c;执行以下指令&#xff0c;安装完成后&#xff0c;电脑重启&#xff0c;安装完成生效。 wsl --install 2. 查看…

离散化算法

简介 预先空间中的有效个体映射到有限空间中去&#xff0c;以此提高算法的时空效率 离散化是一种将数组的值域压缩&#xff0c;从而更加关注元素的大小关系的算法 一些依靠下标实现的算法和数据结构无法实现时&#xff0c;我们就需要离散化 例如原数组的范围是{1&#xff0…

unity学习(66)——控制器Joystick Pack优化

Joystick Pack这种重力带惯性不利于正常开发。决定进行优化。有一种万事俱备只欠东风的感觉。 源代码如下&#xff1a; 1.在脚本中找到轮盘所输出的方向值 2.把方向的改变值加到鸣人模型身上。 2.1控制器脚本中添加model变量 2.2在unity中赋值 2.3代码中修改位置 using Syst…

windows docker

写在前面的废话 最近在学习riscv的软件相关内容&#xff0c;倒是有别人的sg2042机器可以通过ssh使用&#xff0c;但是用起来太不方便了&#xff0c;经常断掉&#xff0c;所以想着在自己的机器上跑一跑riscv的操作系统。最常见的有两种方法吧&#xff0c;第一个就是qemu&#xf…

深入解析stressapptest源码的OsLayer:操作系统相关的抽象接口详解

深入解析stressapptest的OsLayer&#xff1a;操作系统相关的抽象接口详解 一、类概述二、类属性三、主要方法四、功能架构4.1、Initialize()接口4.2、VirtualToPhysical()函数4.3、FlushPageCache(void)函数4.4、FastFlush()函数4.5、FindDimm(uint64, char *, int)函数4.6、Fi…

k8s为什么删除了pod但是还是没删除掉的问题,deployment在影响

deployment 影响pod删除 一、问题所在二、解决问题 一、问题所在 执行&#xff1a;kubectl get pods --all-namespaces&#xff0c;获取dashboard相关的pod kubectl get pods --all-namespaces | grep dashboardkubectl delete pod dashboard-metrics-scraper-546d6779cb-4x6…

AI换脸软件facefusion2.4.1汉化版整合包分享及使用教程

FaceFusion2.4.1版本软件功能:图片换脸&#xff0c;视频换脸&#xff0c;此版本侧脸效果大幅度优化提高无需配置任何环境&#xff0c;解压即用&#xff0c;本地版本&#xff0c;无需联网也可使用&#xff0c;一次下载&#xff0c;永久免费使用效果演示&#xff1a;https://www.…

Python数学建模-2.9Matplotlib库

Matplotlib库是Python中一个非常流行的绘图库&#xff0c;它提供了大量的绘图工具&#xff0c;可以生成各种类型的静态、动态、交互式的图表。Matplotlib的设计初衷是为了与NumPy配合使用&#xff0c;从而提供一个强大的数学绘图工具。 1.Matplotlib的主要特点 丰富的图表类型…

AI程序员已诞生,如何保住自己饭碗?

一、背景 全球首位AI程序员Devin的诞生无疑引发了业界对职业前景和人工智能影响的热烈讨论。AI程序员的出现确实预示着人工智能技术在编程领域的重大突破&#xff0c;它们能够进行自主学习、修复bug、掌握全栈技能&#xff0c;并且在特定场景下展现出了替代部分人类程序员工作…

Redis 更新开源许可证 - 不再支持云供应商提供商业化的 Redis

原文&#xff1a;Rowan Trollope - 2024.03.20 未来的 Redis 版本将继续在 RSALv2 和 SSPLv1 双许可证下提供源代码的免费和宽松使用&#xff1b;这些版本将整合先前仅在 Redis Stack 中可用的高级数据类型和处理引擎。 从今天开始&#xff0c;所有未来的 Redis 版本都将以开…
最新文章