第 217 场周赛

2024-04-21 09:32
文章标签 周赛 217

本文主要是介绍第 217 场周赛,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

第 217 场周赛

  • 1673. 找出最具竞争力的子序列
  • 1674. 使数组互补的最少操作次数

这次就做出第一题,第一题太简单就不写了,最后一题,等后面补上。
我还是太菜了,打完比赛之后写个记录的博客,为了督促自己坚持这一件事情,同时把当时错的思路和对别人写的方法的理解做个记录,方便以后回顾,多回顾帮助吸收为自己的知识。

1673. 找出最具竞争力的子序列

比赛时超时了,我记得以前有道题也是同样的意思,就是每次先留后–k个数,从前面的数中选出最小的,然后再从这个最小的值后一位开始,留–k个数,再选最小的依次类推,但是这么写超时了,比赛中没想出来用stack怎么改下面的方法。

class Solution {public int[] mostCompetitive(int[] nums, int k) {int len = nums.length;int[] res = new int[k];for(int i=0;i<k;i++){res[i] =Integer.MAX_VALUE;}int start = 0;int p=0;while(start<=len-k && k>0){int newStart = start;for(int cur = start;cur<=len-k;cur++){if(res[p]>nums[cur]){res[p] = nums[cur];newStart = cur;}    }// System.out.println("newStart:"+newStart+" res[p]:"+res[p]);start = newStart+1;k--;p++;}return res;}
}

赛后看题解,重新做了这道题

class Solution {public int[] mostCompetitive(int[] nums, int k) {Stack<Integer> stack = new Stack<Integer>();stack.add(-1);int len = nums.length;for(int i=0;i<len;i++){while(nums[i]<stack.peek() && (k+1-stack.size()<len-i)){stack.pop();}if(stack.size()<k+1){stack.add(nums[i]);}}int[] ret = new int[k];while(k>0){ret[--k] = stack.pop();}return ret;}
}

1674. 使数组互补的最少操作次数

差分数组

这题理解了半天,看了好多题解,大致意思是两数之和的取值范围分为几段,
1<sum<min+1:需要改变两次
min+1<=sum<min+max:需要改变一次
min+max=sum:不需要改变
min+max+1<=sum<=max+limit:只需要改变一次
max+limit+1<=sum<=limit*2:需要改变两次

所以如果sum选在
1、1~Min(nums) 那就是 2nums.length次操作数(最差的情况)
2、然后从2向右发展,遍历数组中的每个元素,如果(min+1<=sum<min+max)就在2的基础上-1;到min+max再-1;到min+max+1再+1;依次类推
3、这样遍历之后就2~2
limit,看选哪个值时改变的次数最小。

我也不知道有没有解释清楚,我也是看了题解想了很久才想明白。。

class Solution {public int minMoves(int[] nums, int limit) {int[] diff = new int[2*limit+2];int len = nums.length;for(int i=0;i<len/2;i++) {int min = Math.min(nums[i], nums[len-1-i]);int max = Math.max(nums[i], nums[len-1-i]);diff[1]+=2;diff[min+1]-=1;diff[min+max]-=1;diff[min+max+1]+=1;diff[max+limit+1]+=1;diff[2*limit+1]-=2;}int ans = len;int sum=diff[1];for(int i=2;i<=limit*2;i++) {sum+=diff[i];ans = ans>sum?sum:ans;}return ans;}
}

这篇关于第 217 场周赛的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/922739

相关文章

LeetCode 第414场周赛个人题解

目录 Q1. 将日期转换为二进制表示 原题链接 思路分析 AC代码 Q2. 范围内整数的最大得分 原题链接 思路分析 AC代码 Q3. 到达数组末尾的最大得分 原题链接 思路分析 AC代码 Q4. 吃掉所有兵需要的最多移动次数 原题链接 思路分析 AC代码 Q1. 将日期转换为二进制表示 原题链接 Q1. 将日期转换为二进制表示 思路分析

LeetCode --- 413周赛

题目列表 3274. 检查棋盘方格颜色是否相同 3275. 第 K 近障碍物查询 3276. 选择矩阵中单元格的最大得分 3277. 查询子数组最大异或值 一、检查棋盘方格颜色是否相同 题目给定两个字符串来表示两个方格的坐标,让我们判断这两个方格的颜色是否相同,这里我们要观察棋盘的颜色特征,我们就会发现奇数行的奇数列和偶数行的偶数列是黑色,其他都是白色,所以我们可以直接计算出每个方

牛客周赛 Round 58(ABCDF)

目录 A.会赢吗? B.能做到的吧   C.会赢的! D.好好好数 F.随机化游戏时间 A.会赢吗? 思路: 签到题,比大小 void solve(){double a,b;cin>>a>>b;if(a>=b) cout<<"NO";else cout<<"YES";} B.能做到的吧  思路:只要能变大就行,那么我们就将字符串从大到小排序,如

基于STM32设计的ECG+PPG人体参数测量系统(华为云IOT)(217)

文章目录 一、前言1.1 项目介绍【1】开发背景【2】项目实现的功能【3】项目硬件模块组成 1.2 设计思路【1】整体设计思路【2】整体构架【3】上位机开发思路【4】ESP8266工作模式配置 1.3 项目开发背景【1】选题的意义【2】可行性分析【3】参考文献【4】摘要【5】项目背景 1.4 开发工具的选择【1】设备端开发【2】上位机开发 1.5 系统框架图1.6 系统功能总结1.7 设备原

【每日一题】【进制数】【思维】好好好数 牛客周赛 Round 58 D题 C++

牛客周赛 Round 58 D题 好好好数 题目背景 牛客周赛 Round 58 题目描述 样例 #1 样例输入 #1 260 3114 514 样例输出 #1 2114 做题思路 考虑到k-好数实际上是 k k k进制下取0/1的操作。 而且问题也是k-好数的和,其工作原理和算进制数一样。 例如 30 = 3 3 + 3 1 30 = 3^3+3^1 30

【每日一题】【博弈论】【思维】会赢的! 牛客周赛 Round 58 C题 C++

牛客周赛 Round 58 C题 会赢的! 题目背景 牛客周赛 Round 58 题目描述 样例 #1 样例输入 #1 31 11 0-1 -1 样例输出 #1 NOYESPING 做题思路 首先考虑到开始位置为 ( 0 , 0 ) (0,0) (0,0)并且只能使横纵坐标递增。所以如果终点的横纵坐标为负数的情况是不可能到达的。所以平局。 第一个点: x

LeetCode 第413场周赛个人题解

目录 3274. 检查棋盘方格颜色是否相同 原题链接 思路分析 AC代码 3275. 第 K 近障碍物查询 原题链接 思路分析 AC代码 3276. 选择矩阵中单元格的最大得分 原题链接 思路分析 AC代码 3277. 查询子数组最大异或值 原题链接 思路分析 AC代码 3274. 检查棋盘方格颜色是否相同 原题链接 3274. 检查棋盘方

LeetCode --- 412周赛

题目列表 3264. K 次乘运算后的最终数组 I 3266. K 次乘运算后的最终数组 II 3265. 统计近似相等数对 I 3267. 统计近似相等数对 II 一、K次乘预算后的最终数组 I & II  I 数据范围比较小,可以暴力模拟,代码如下 class Solution {public:vector<int> getFinalState(vector<int>& n

__周赛(最小生成树(Prime))

将已经链接的边的权值设为0即可。 但是可能会超时,提交的时候,有一次显示超时,所以这个解法是有问题的,看到有171ms的,实力差的太大了,还是得使劲刷题。 /*2015-5-18 951ms*/#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define INF 0x3f3f3f3f

牛客周赛 Round 57 ABCDFG

A题:小红喜欢1  题意 输出1所在的位置 思路 无 代码 #include <bits/stdc++.h>using namespace std;int main() {for (int i = 1; i <= 5; i ++ ) {int x; cin >> x;if (x) cout << i << endl;}return 0;} B题:小红的树切割  题意 对于一