当前位置: 首页 > news >正文

LeetCode --- 414周赛

题目列表

3280. 将日期转换为二进制表示

3281. 范围内整数的最大得分

3282. 到达数组末尾的最大得分

3283. 吃掉所有兵需要的最多移动次数

一、将日期转换成二进制表示

题目本质就是将数字转成二进制字符串,可以类比将十进制数字的每一位拆开拼成字符串,直接模拟即可,代码如下

class Solution {string get(string s){int x = stoi(s);string ans;while(x){ans += (x & 1) + '0';x >>= 1;}reverse(ans.begin(),ans.end());return ans;}
public:string convertDateToBinary(string date) {// int pos1 = date.find('-');// int pos2 = date.rfind('-');// return get(date.substr(0, pos1)) + '-' //     + get(date.substr(pos1+1,pos2-pos1-1)) + '-'//     + get(date.substr(pos2+1));// 当然我们也可以直接观察字符串的格式,对字符串进行切割return get(date.substr(0, 4)) + '-' + get(date.substr(5, 2)) + '-'+ get(date.substr(8));}
};

二、范围内整数的最大得分

看到最大最小,就要想到二分,然后我们来判断这题能否用二分来写,即判断是否具有单调性。(当然不是所有的最大最小题都能用二分来解决,只是二分对于大部分的这类题目有奇效)

得分越大 => 相邻两个数之间的距离就越远,而范围是固定的,则越难找到满足要求的整数。满足单调性,可以二分,接下来,我们只要考虑 check 函数如何写,即判断一个得分是否能有合法的方案实现 --- 我们可以贪心的去考虑每一个整数的选取:对于每一个区间,我们尽可能的去区间的左边选数,给后面的区间留下尽可能大的范围去进行选择,看是否每一个区间都能选择出一个数代码如下

class Solution {
public:int maxPossibleScore(vector<int>& start, int d) {int n = start.size();ranges::sort(start);auto check = [&](int k)->bool{long long pre = start[0]; // 注意:pre可能会超int范围,要用long longfor(int i = 1; i < n; i++){if(pre + k <= start[i])pre = start[i];else if(pre + k <= start[i] + d)pre += k;else return false;}return true;};int l = 0, r = (start.back() + d - start[0]) / (n - 1) + 1;while(l <= r){int mid = l + (r - l)/2;if(check(mid)) l = mid + 1;else r = mid - 1;}return r;}
};

三、到达数组末尾的最大得分

这题很容易让人想到动态规划,状态定义为 dp[i] 以 i 为结尾的最大总得分,dp[i] = max(dp[k]+(i-k)*nums[k]),然后取dp中的最大值返回,时间复杂度为O(n^2),显然是过不了的,而且我们也无法优化,如何做?当我们dp做不出的时候,我们可以取想想贪心。

那么如何贪心呢?我们来观察这个式子 (j - i) * nums[i],我们可以从柱状图的方式去思考这个式子

(j - i) * nums[i] 的本质就是 长 * 宽,即让我们选择尽可能大的nums[i]作为矩阵的边长,让单个矩阵的面积最大,从而让面积之和最大。代码如下

class Solution {using LL = long long;
public:long long findMaximumScore(vector<int>& nums) {int n = nums.size();LL ans = 0;int mx = 0;for(int i = 0; i < n - 1; i++){mx = max(mx, nums[i]); // 取前缀最大值 加入 ansans += mx;}return ans;}
};

四、吃掉所有兵需要的最多移动步数

思路:首先,我们要预处理得到马在任意位置到达每个兵的最小步数,这里我们也可以反向考虑,假设马在兵的位置上时,到达任意位置的最小步数,可以用bfs解决,然后我们就能dfs暴力的枚举Alice和Bob吃哪一个兵能使得个自的策略最优,代码如下

class Solution {const int dir[8][2]={-2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1};
public:int maxMoves(int kx, int ky, vector<vector<int>>& positions) {int n = positions.size();int f[n][50][50];memset(f, -1, sizeof(f));for(int i = 0; i < n; i++){int x0 = positions[i][0], y0 = positions[i][1];queue<pair<int,int>> q;q.emplace(x0, y0);f[i][x0][y0] = 0;while(q.size()){auto [x, y] = q.front(); q.pop(); // cout << x << " " << y << endl;for(int j = 0; j < 8; j++){int dx = x + dir[j][0];int dy = y + dir[j][1];if(dx < 0 || dx >= 50 || dy < 0 || dy >= 50 || f[i][dx][dy] >= 0)continue;f[i][dx][dy] = f[i][x][y] + 1;q.emplace(dx, dy);}}}int memo[n][1<<n];memset(memo, -1, sizeof(memo));function<int(int,int)> dfs = [&](int i, int mask)->int{if(mask == (1 << n) - 1) return 0;if(memo[i][mask] != -1) return memo[i][mask];int cnt0 = __builtin_popcount(mask);int res = cnt0 & 1 ? INT_MAX : 0;int x0 = positions[i][0], y0 = positions[i][1];for(int j = 0; j < n; j++){if(mask >> j & 1) continue;    int x = positions[i][0], y = positions[i][1];if(cnt0 & 1){res = min(res, dfs(j, mask | 1 << j) + f[j][x][y]);}else{res = max(res, dfs(j, mask | 1 << j) + f[j][x][y]);}}return memo[i][mask] = res;};int ans = 0;for(int i = 0; i < n; i++){ans = max(ans, dfs(i, 1 << i) + f[i][kx][ky]);}return ans;}
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 深入理解Linux中的多路复用技术:select、poll与epoll
  • 玄机靶场初体验
  • 目标检测-小目标检测方法
  • 《ORANGE‘s 一个操作系统的实现》-- ubuntu14.04下bochs2.3.5的配置与使用
  • 【第34章】Spring Cloud之SkyWalking分布式日志
  • JVM四种垃圾回收算法以及G1垃圾回收器(面试)
  • 今日leetCode 242.有效的字母异位词
  • 云服务器部署DB-GPT项目
  • .Net 执行Linux下多行shell命令方法
  • 无线领夹麦克风哪个牌子好,口碑最好的麦克风品牌,领夹麦推荐
  • 什么是数据资源?
  • ImportError: DLL load failed while importing _ssl: 找不到指定的模块的解决方法
  • .NET/C#⾯试题汇总系列:集合、异常、泛型、LINQ、委托、EF!(完整版)
  • 大模型从失败中学习 —— 微调大模型以提升Agent性能
  • 【贪心算法】贪心算法
  • 【个人向】《HTTP图解》阅后小结
  • Android Volley源码解析
  • Asm.js的简单介绍
  • java8 Stream Pipelines 浅析
  • JavaScript学习总结——原型
  • Mysql数据库的条件查询语句
  • SpiderData 2019年2月25日 DApp数据排行榜
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • Yii源码解读-服务定位器(Service Locator)
  • 和 || 运算
  • 前端_面试
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • ## 基础知识
  • ###项目技术发展史
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • $$$$GB2312-80区位编码表$$$$
  • $GOPATH/go.mod exists but should not goland
  • (3)(3.5) 遥测无线电区域条例
  • (C)一些题4
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (三)docker:Dockerfile构建容器运行jar包
  • (一)springboot2.7.6集成activit5.23.0之集成引擎
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)程序员疫苗:代码注入
  • *** 2003
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .net mvc 获取url中controller和action
  • .NET Standard 的管理策略
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .net开发时的诡异问题,button的onclick事件无效
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .Net中ListT 泛型转成DataTable、DataSet
  • .Net中的集合
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • [1] 平面(Plane)图形的生成算法
  • [1181]linux两台服务器之间传输文件和文件夹