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

Coding Practice,48天强训(22)

Topic 1:添加字符

添加字符_牛客笔试题_牛客网

只允许头尾插入,也就是说只需要找到A在B中最匹配的位置,头尾插入的其实不用管,可以视作插和B一样的字符即可,所以找到A在B中最匹配的位置就等于找到了最少的不相等位数;

#include <bits/stdc++.h>
using namespace std;int main() 
{string A, B;cin >> A >> B;int res = INT_MAX, nA = A.length(), nB = B.length();   for(int i = 0; i <= nB - nA; ++i){int tmp = 0;for(int j = 0; j < nA; ++j){if(A[j] != B[i + j]) tmp++;}res = min(res, tmp);}cout << res << endl;
}

简单题简单做,没啥难度

Topic 2:数组变化

数组变换__牛客网

隐约感觉这题做过,分析一下,发现是在考察指数幂的问题,将一个数自由的(n次)乘两倍,其实就可以视作是2^n倍,那么我们也可以通过/2的操作把所有的数字还原到最小单位来进行比较,如果最后还原的最小单位都相等,也就意味着这些数字都是可以通过*2的操作,在某一时刻同时相等的,只是次数的不同而已;

比如两个数2 8,8可以视作2^3——1 * 2 * 2 * 2                     2可以视作1 * 2

在拥有无限*2操作权限的某一个时刻,这个2可以视作一个8,将两数不断/2,直到某个时刻,没办法再整除为止,也就是奇数时,比如8 2两个数不断/2,最后都被还原成1,对于这个1而言,只有后面跟着*2的次数不同,所以这两个数符合条件;

再比如两个数6,8,不断/2直至不能整除,6还原成3,3不能整除2,停止;8最后还原成1,3 != 1,所以6和8不符合条件

#include <bits/stdc++.h>
using namespace std;int main() 
{int n;cin >> n;vector<int> v(n);bool res = true;for(int i = 0; i < n; ++i){cin >> v[i];while(!(v[i] % 2)) v[i] /= 2;if(v[i] != v[0]){res = false;break;}}cout << (res ? "YES" : "NO") << endl;
}

思路清晰代码就简单;还有一种方法,位运算的方法

#include <bits/stdc++.h>
using namespace std;int main() 
{int n;cin >> n;vector<int> v(n);bool res = true;for (int i = 0; i < n; ++i) {cin >> v[i];// 用位运算替代 %2 和 /2while ((v[i] & 1) == 0) v[i] >>= 1;if (v[i] != v[0]) {res = false;break;}}cout << (res ? "YES" : "NO") << endl;return 0;
}

Topic 3:装箱问题

装箱问题_牛客题霸_牛客网

01年的真题,20多年了,一个01背包的退阶问题,只用考虑重量,用动态规划来解

#include <bits/stdc++.h>
using namespace std;int main()
{int v, n; // v:箱子容量,n:物品数量cin >> v >> n;vector<int> grid(n); // grid[i] 表示第 i 件物品的体积for(int i = 0; i < n; ++i) cin >> grid[i];// dp[j] 表示:在容量为 j 的情况下,能装入的最大体积// 初始化为 0,因为什么都不装时最大体积是 0vector<int> dp(v + 1, 0);//v + 1,因为下标从0开始,v + 1能表示重量v的装载体积for(int i = 0; i < n; ++i)// 遍历每一件物品{for(int j = v; j >= grid[i]; --j)// 逆序遍历容量,从大到小,确保每件物品只能被使用一次(0/1 背包){// 如果当前容量 j 能装下这件物品,就比较是否装上更优// 两种选择:不选这件物品(dp[j]),或选(dp[j - grid[i]] + grid[i])dp[j] = max(dp[j], dp[j - grid[i]] + grid[i]);}}// 箱子剩余空间 = 原始容量 v - 实际装进去的最大体积int res = v - dp[v];cout << res << endl;return 0;
}

这题没特别熟悉,之后有时间复习整个背包板块再来做一遍;

相关文章:

  • Nginx通过自定义参数,实现同一域名在不同设备下访问不同站点的操作
  • RefFormer论文精读
  • 【MySQL专栏】MySQL数据库的复合查询语句
  • 用 LangChain 手搓 RAG 系统:从原理到实战
  • [AI技术(二)]JSONRPC协议MCPRAGAgent
  • Cadence学习笔记之---原理图设计基本操作
  • ValidatorUtils工具
  • 《Piper》皮克斯技术解析:RIS系统与云渲染如何创造奥斯卡级动画短片
  • 【C语言练习】002. 理解C语言的基本语法结构
  • ECMAScript 1(ES1):JavaScript 的开端
  • 基于大牛直播SDK的Android屏幕扬声器采集推送RTMP技术解析
  • 浅谈OpenAIClaude LLM Tools的额外配置
  • 计算机网络中的DHCP是什么呀? 详情解答
  • 【速写】钩子与计算图
  • 抓包工具Wireshark的应用解析
  • Linux文件管理完全指南:从命名规则到压缩解压
  • 每日c/c++题 备战蓝桥杯(P1049 [NOIP 2001 普及组] 装箱问题)
  • 分层设计数据仓库的架构和设计高效数据库系统的方法
  • 自然语言处理+知识图谱:智能导诊的“大脑”是如何工作的?
  • 人工智能常见的数据处理方法
  • 当代视角全新演绎,《风雪夜归人》重归首都剧场
  • 政治局会议深度|提出“设立新型政策性金融工具”有何深意?
  • 财政部:前3月国有企业利润总额10907.4亿元,同比增1.7%
  • 从篆刻书画到装帧设计,再看钱君匋的“艺兼众美”
  • 国家市场监管总局:民生无小事,严打民生领域侵权假冒违法行为
  • 生于1984年,马玥已任辽宁锦州北镇市代市长