考研机试题

目录

  • 头文件与STL
  • 动态规划
    • 最大数组子串和
    • 最长公共子序列
    • 最长连续公共子串
    • 最长递增子序列
    • 最大上升子序列和
    • 0-1背包
    • 多重背包
    • 多重背包问题 I
    • 整数拆分
    • 最小邮票
    • 最大子矩阵
  • 数学问题
    • 朴素法筛素数
    • 线性筛素数
    • 快速幂
  • 石子合并
  • 锯木棍
  • 并查集
  • Dijkstra单源最短路
  • Python进制转换(整数无限大)
  • 全排列
  • 神奇的口袋
  • 全排列II
  • 放苹果
  • 求第k小
  • 八皇后问题
  • 哈夫曼编码
  • KMP算法
  • 遍历建立二叉树

头文件与STL

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;vector.insert(vector.begin(),2,99)//在头部插入2个99
vector.erase(vector.begin() + 5, vector.end()) //删除第5个以后的元素map<string,int>
map.insert(pair<string, int>())
map.count() //0或1
map.earse() //删除string s;
s.find()
s.substr(int start,int length) //切割子串
//输入含空格字符串
getline(cin,s); //优先队列    
priority_queue<int,vecotr<int>,greater<int>>; //less是降序

python输入

import sys
for line in sys.stdin:arr = line.split()
//拼接列表' '.join(list)a = int(arr[0])

动态规划

最大数组子串和

dp[i]其实代表的是以i结尾的最大子串和

for(int i=0;i<n;i++){cin>>a[i];// 需要额外的ans存储max,因为是子串dp[i+1]=max(dp[i]+a[i],a[i]);ans=max(dp[i+1],ans);
}

最长公共子序列

动态规划

for(int i=1;i<=s1.size();i++){for(int j=1;j<=s2.size();j++){if(s1[i-1]==s2[j-1])dp[i][j]=dp[i-1][j-1]+1;else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);}
}

最长连续公共子串

//t存储公共子串在s1中的末尾位置
int t=0;
//最大长度,要额外的maxLen存储max,因为是子串
int maxLen=0;
for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(s1[i-1]==s2[j-1]){dp[i][j]=dp[i-1][j-1]+1;// =号确保 如果不唯一,则输出s1中的最后一个。if(dp[i][j]>=maxLen){maxLen=dp[i][j];//存储公共子串在s1中的末尾位置,可以输出子串t=i-1;}} }
}

最长递增子序列

https://www.nowcoder.com/practice/cf209ca9ac994015b8caf5bf2cae5c98?tpId=40&tags=&title=&difficulty=0&judgeStatus=0&rp=1&sourceUrl=

dp[i]只代表以i结尾的最长递增子序列数

for(int i=0;i<n;i++){//初始化:最长为本身 1dp[i]=1;for(int j=0;j<i;j++){//dp[i]代表以i结尾的最长递增子序列数if(a[i]>a[j])dp[i]=max(dp[j]+1,dp[i]);ans=max(dp[i],ans);}
}

最大上升子序列和

和上述最长递增子序列思路一致,不过dp[i]代表以i结尾的最长递增子序列的和,用ans存储结果

0-1背包

int dp[1001][1001];//代表前i个物体,背包为j的最大价值
int n,bag;
int v[10001],w[10001];
cin>>n>>bag;
for(int i=1;i<=n;i++){cin>>v[i]>>w[i];
}
dp[0][0]=0;
for(int i=1;i<=n;i++){for(int j=1;j<=bag;j++){if(j>=v[i]){dp[i][j]=max(dp[i-1][j-v[i]]+w[i],dp[i-1][j]);}else{dp[i][j]=dp[i-1][j];}}
}
cout<<dp[n][bag];

多重背包

每种物品无限件

for(int i=1;i<=n;i++){for(int j=v[i];j<=m;j++){dp[j]=max(dp[j],dp[j-v[i]]+w[i]);}
}

多重背包问题 I

第 i 种物品最多有 si件,

//将 si拆成多个物品,即01背包while(s--)
{a[++t]=v;b[t]=w;
}//死拆,把多重背包拆成01背包

整数拆分

一个整数总可以拆分为2的幂的和

//奇数
if(i%2)dp[i]=dp[i-1];
//偶数 ?没想明白***
else dp[i]=(dp[i-1]+dp[i/2])%1000000000;

最小邮票

dp[0][0]=0;
for(int i=1;i<=m;i++){//代表集不齐dp[0][i]=1e9;
}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(j-a[i]>=0)dp[i][j]=min(dp[i-1][j-a[i]]+1,dp[i-1][j]);elsedp[i][j]=dp[i-1][j];}
}

最大子矩阵

子矩阵的和:pivot - dp[k-1][j] - dp[i][q-1] + dp[k-1][q-1]

 for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {cin >> matrix[i][j];//计算机前缀和dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + matrix[i][j];}}int  ans = INT_MIN;//记录最大子矩阵位置int x1,x2,y1,y2;for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++) {int pivot = dp[i][j];for (int k = 1; k <= i; k++) {for (int q = 1; q <= j; q++) {if((pivot - dp[k-1][j] - dp[i][q-1] + dp[k-1][q-1])>ans){ans = max(ans, pivot - dp[k-1][j] - dp[i][q-1] + dp[k-1][q-1]);x1=k;x2=i;y1=q;y2=j;}}}}}cout << ans<<endl;cout<<x1<<y1<<" "<<x2<<y2<<endl;

数学问题

朴素法筛素数

求n以内的所有素数,时间O(nlog(logn))【不是最优:例如14会被2和7筛重复2次】

void get_primes(int n){for(int i=2;i<n;i++){//i被筛了,直接跳过if(st[i]) continue;//i是素数,添加进数组,并筛掉与i成倍数的非素数else {primes[cnt ++ ] = i;for(int j=2*i;j<=n;j+=i){//j一定不是素数st[j]=true;}}}
}

线性筛素数

时间O(n),解决重复筛

for(int i=2;i<=n;i++){//i没被筛,加入if(!st[i]) primes[prime_count++]=i;for(int j=0;j<prime_count;++j){if(prime[j]*i>n) break;//翻倍,一个数 * 素数一定为合数 st[primes[j]*i]=true;//退出循环,避免之后重复进行筛选if(i%primes[j]==0) break;}
}

快速幂

int qmi(int a,int b, int p){if(b==0)return 1 ; int k = qmi(a,b/2,p)%p;// k*k可能会超过int if(b%2==0)return (1LL*k*k) %p;else return ((1LL*k*k)%p*a)%p;}

石子合并

贪心:只能合并相邻的最小的两堆

int n;int min_idx=0;int min_sum=1e7;
//	边界处理ve.push_back(1e7);int ans=0;cin>>n;for(int i=1;i<=n;i++){int x;cin>>x;ve.push_back(x);if(min_sum>ve[i]+ve[i-1]){min_sum=ve[i]+ve[i-1];min_idx=i;}}while(ve.size()>2){ans += min_sum;ve[min_idx]=ve[min_idx]+ve[min_idx-1];ve.erase(ve.begin()+min_idx-1);min_sum=1e7;
//		min_idx=0;if(ve.size()<=2) break;	for(int i=1;i<ve.size();i++){if(min_sum>ve[i]+ve[i-1]){min_sum=ve[i]+ve[i-1];min_idx=i;}}}cout<<ans<<endl;

锯木棍

贪心-思想是WPL最小带权路径,永远合并最小的两个

#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
//自定义比较结构体
struct cmp{//函数重载 注意两个括号!!!bool operator()(int a,int b){//稳定if(a==b) return false;else return a>b;}
};int main(int argc, char** argv) {//priority_queue<int,vector<int>,greater<int>> que;priority_queue<int,vector<int>,cmp> que;int n,l;cin>>n>>l;int tmp;int ans=0;while(n--){cin>>tmp;que.push(tmp);}	while(que.size()!=1){int a=que.top();que.pop();int b=que.top();que.pop();que.push(a+b);ans=ans+a+b;}cout<<ans;	return 0;
}

并查集

int Find(int a){int x=a;while(s[x]>0){x=s[x];}return x;
}
void Union(int a,int b){root1=Find(a);root2=Find(b);if(root2==root1)return ;else{s[root2]=root1;}}

Dijkstra单源最短路

int g[N][N];  // 存储每条边
int dist[N];  // 存储1号点到每个点的最短距离
bool st[N];   // 存储每个点的最短路是否已经确定// 求1号点到n号点的最短路,如果不存在则返回-1
int dijkstra()
{memset(dist, 0x3f, sizeof dist);dist[1] = 0;for (int i = 0; i < n - 1; i ++ ){int t = -1;     // 在还未确定最短路的点中,确定一个最短的点for (int j = 1; j <= n; j ++ )if (!st[j] && (t == -1 || dist[t] > dist[j]))t = j;// 用t更新其他点的距离for (int j = 1; j <= n; j ++ )dist[j] = min(dist[j], dist[t] + g[t][j]);st[t] = true;}if (dist[n] == 0x3f3f3f3f) return -1;return dist[n];}

Python进制转换(整数无限大)

import sysfor line in sys.stdin:a = line.split()a=int(a[0])b=bin(a)s=(b[2:][::-1])print(int(s,2))

全排列

回溯法

void dfs(int k){if(k==n+1){for(int i=1;i<=n;i++){cout<<arr[i]<<' ';}cout<<'\n';return ;}for(int i=1;i<=n;i++){//还没访问的数if(!st[i]){st[i]=true;// 存储第k个数arr[k]=i;dfs(k+1);// 恢复-现场st[i]=false;}}
}
int main() {    cin>>n;dfs(1);}

神奇的口袋

有一个神奇的口袋,总容积是40,有n个物品,体积为Vi,装满40有多少种装法

void dfs(int u,int j){if(u==40){ans++;   }else{//从j开始,前面用过的舍弃掉,防止重复for(int i=j;i<n;i++){if(!st[i]){st[i]=true;dfs(u+v[i],i);st[i]=false;}}}
}

全排列II

带有重复元素的全排列

void dfs(int k){if(k==n+1){for(int i=1;i<=n;i++){cout<<arr[i]<<' ';}cout<<'\n';return ;}for(int i=1;i<=n;i++){//还没访问的数if(!st[i]){st[i]=true;// 存储第k个数arr[k]=i;dfs(k+1);// 恢复-现场st[i]=false;//***当与后一个元素重复时,跳过不排列,且这一步要在恢复现场之后做while(s[i+1]==s[i])i++;}}
}
int main() {    cin>>n;//使重复的元素排在一起sort(a,a+n);dfs(1);}

放苹果

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?

//处理边界
for(int i=0;i<=m;i++){//为0的可以不用处理,数组默认为0//1个盘子的dp[i][1]=1;
}
for(int i=0;i<=n;i++){//0个苹果的dp[0][i]=1;
}for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){//如果盘子多,多余的用不到的盘子都是没用的if(j>i){dp[i][j]=dp[i][i];}//如果苹果多,dp[i][j]等于 有空盘子的(挑一个盘子为空)+没有空盘子(每个盘子初始都放一个苹果)的状态else{dp[i][j]=dp[i][j-1]+dp[i-j][j];}}
}

求第k小

使用快排划分的思想

#include <iostream>
#include <algorithm>
/**求第k小 */
using namespace std;
int n;
int a[10001];
int k;
void partition(int start,int end) {int pivot=a[start];int l=start;int r=end;while(l<r) {while(a[l]<pivot) {l++;}while(a[r]>pivot) {r--;}swap(a[l],a[r]);}a[l]=pivot;if(l==k-1) {cout<<a[l];return ;}else if(l<k){partition(l+1,end);}else{partiton(start,l);}
}int main(int argc, char** argv) {cin>>n;cin>>k;for(int i=0; i<n; i++) {cin>>a[i];}partition(0,n-1);return 0;
}

八皇后问题

哈夫曼编码

priority_queue<int,vector<int>,greater<int> q;
int alpha[26];
//去最小的两个

KMP算法

//字符串下标都从0开始
void getNextTable(int m){int j=0;next[0]=-1;int i=-1;while(j<m){if(i==-1 || pattern[j]==pattern[i]){i++;j++;next[j]=i;}else{i=next[i];}}return ;
}int kMP(string a,string b){int i=0,j=0;while(i<n&&j<m){if(j==-1 || s[i]==pattern[j]){i++;j++;}else{j=next[j];}}if(j==m){return i-j+1;}else{//匹配失败return -1;}
}

遍历建立二叉树

TNode(char c):data©,left(nullptr),right(nullptr){};

using TreeNode = struct TNode{char data;struct TNode* left;struct TNode* right;TNode(char c):data(c),left(nullptr),right(nullptr){};
};TreeNode* Build(TreeNode* root,char c){if(c=='#')return NULL;
//	C style:(TreeNode*)malloc(sizeof(TreeNode))root=new TNode(c);char c1=s[cnt++];root->left=Build(root->left,c1);char c2=s[cnt++];root->right=Build(root->right,c2);return root;
}void Inorder(TreeNode* root){if(root->left)Inorder(root->left);cout<<root->data<<endl;if(root->right)Inorder(root->right);}
void postOrder(TreeNode* root){}int main(int argc, char** argv) {TreeNode* T=NULL;T=Build(T,s[cnt++]);Inorder(T);return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB教程

目录 前言一、MATLAB基本操作1.1 界面简介1.2 搜索路径1.3 交互式命令操作1.4 帮助系统 二、MATLAB语言基础2.1 数据类型2.2 MATLAB运算2.2.1 算数运算2.2.2 关系运算2.2.3 逻辑运算 2.3 常用内部函数2.4 结构数据与单元数据 三、MATLAB程序设计3.1 M文件3.2 函数文件3.3 程序控…

c#接口 axios的get请求url过长时该怎么做

今天又碰到了&#xff0c;大托参数拼在url里用get传 1、改服务器最大字数限制&#xff08;还是会错&#xff09; 2、改post&#xff08;有些还要跟着把[FromUri]改成[FromBody]&#xff09;

Dubbo如何支持集群容错?有哪些集群容错模式?Dubbo的路由策略是怎样的?如何根据路由规则选择服务提供者?

Dubbo如何支持集群容错&#xff1f;有哪些集群容错模式&#xff1f; Dubbo通过ClusterInvoker接口和相关的实现类来支持集群容错。ClusterInvoker在原有的Invoker基础上增加了集群容错的能力&#xff0c;使得在分布式调用过程中&#xff0c;当某个服务提供者出现故障或不可用时…

Android 性能优化——APP启动优化

一、APP启动流程 首先在《Android系统和APP启动流程》中我们介绍了 APP 的启动流程&#xff0c;但都是 FW 层的流程&#xff0c;这里我们主要分析一下在 APP 中的启动流程。要了解 APP 层的启动流程&#xff0c;首先要了解 APP 启动的分类。 1、启动分类 冷启动 应用从头开始…

windows查看局域网内所有已使用的IP IP扫描工具 扫描网段下所有的IP Windows环境下

推荐使用&#xff1a; Advanced IP Scanner 官网下载&#xff1a; https://www.advanced-ip-scanner.com/

sqllab第35-45关通关笔记

35关知识点&#xff1a; 宽字节注入数值型注入错误注入 payload:id1andextractvalue(1,concat(0x7e,database(),0x7e))0--联合注入 payload:id0unionselect1,database(),version()-- 36关知识点&#xff1a; 字符型注入宽字节注入错误注入 payload:id1%df%27andextractvalue(…

广州大彩科技新品发布:大彩科技COF系列2.4寸串口屏发布!

一、产品介绍 此次发布的是S系列平台2.4寸COF超薄结构串口屏&#xff0c;分辨率为240*320&#xff0c;该平台采用了Cortex-M3内核的处理器&#xff0c;内置了2Mbyte PSRAM和64Mbit FLASH&#xff0c;是专为小尺寸串口屏设计的MCU&#xff0c;精简了外围电路。 该平台默认支持大…

Docker 各种部署应用的详细参数

持续更新 Docker 部署pgsql命令 docker run -d \ --restartalways \ --name pgsql \ -v /data/apps/pgsql/data:/var/lib/postgresql/data \ -e POSTGRES_PASSWORDabc123 \ -p 15432:5432 postgres:14.10

开发常用的一些工具总结

开发常用的一些工具总结 记录一些常用的开发软件. Android 开发相关 : Android studio 安卓开发者必备的编辑器,也是我用过最好用的编辑器.还可以用来写JNI 和C.Android studio 插件 : GsonFormatLeakCanary 其他 VS Code :轻量级的开发工具,插件非常多,很好用,但是上手难度…

React+umi+dva 项⽬实战-lesson6

lesson4-react全家桶及原理解析.mov 项⽬实战 项⽬实战 课堂⽬标资源知识要点起步Generatorredux-sagaumi why umidvadva+umi 的约定安装Umi基本使⽤理解dva移动端cra项⽬简介课堂⽬标 掌握企业级应⽤框架 - umi掌握数据流⽅案 - dva掌握⽣成器函数 - generator掌握redux异步⽅…

青海200MW光伏项目 35kV开关站图像监控及安全警示系统

一、背景 随着我国新能源产业的快速发展&#xff0c;光伏发电作为清洁能源的重要组成部分&#xff0c;得到了国家政策的大力扶持。青海作为我国光伏资源丰富地区&#xff0c;吸引了众多光伏项目的投资建设。在此背景下&#xff0c;为提高光伏发电项目的运行效率和安全性能&…

【C++】堆区空间的申请和释放--- 2024.3.19

目录 C和C的区别&#xff08;申请堆区空间&#xff09;C中的new和delete结束语 C和C的区别&#xff08;申请堆区空间&#xff09; 在c语言中&#xff0c;在遇到需要申请一块堆区空间时&#xff0c;我们往往会使用malloc申请&#xff0c;使用free进行释放&#xff0c;但是为什么…

数据可信流通:从运维信任到技术信任

1.数据可信流通概念 "数据可信流通"通常指的是确保数据在不同系统、应用程序或者组织之间的传输和交换过程中的可信性、完整性和安全性。在数据流通的过程中&#xff0c;确保数据的真实性、完整性和保密性是非常重要的&#xff0c;尤其是涉及到敏感信息或者重要数据…

GateWay路由规则

Spring Cloud GateWay 帮我们内置了很多 Predicates功能&#xff0c;实现了各种路由匹配规 则&#xff08;通过 Header、请求参数等作为条件&#xff09;匹配到对应的路由 1 时间点后匹配 server:port: 8888 spring:application:name: gateway-servicecloud:nacos:discovery:…

使用verilog写一个模拟比特币挖矿游戏及testbench

设计模拟比特币挖矿游戏需要考虑到以下几个方面: 游戏目标和规则: 确定游戏的目标,例如挖取尽可能多的比特币或达到一定的挖矿目标。确定游戏的规则,例如通过计算难题来进行挖矿、使用特定的硬件设备等。确定状态及状态转移条件: 确定游戏中可能存在的状态,如等待开始、准…

Vue利用axios发送请求并代理请求

由于浏览器的同源策略&#xff0c;发送请求时常常遇到跨域问题&#xff0c;一种解决办法是让后端配置跨域&#xff0c;还有一种就是使用代理&#xff08;与前端工程一起启动&#xff0c;同一个端口&#xff09;&#xff0c;因为代理不是通过浏览器发送的&#xff0c;所以不受同…

蓝桥杯历年真题省赛java b组 2017年第八届 k倍区间

一、题目 k倍区间 给定一个长度为N的数列&#xff0c;A1, A2, ... AN&#xff0c;如果其中一段连续的子序列Ai, Ai1, ... Aj(i < j)之和是K的倍数&#xff0c;我们就称这个区间[i, j]是K倍区间。 你能求出数列中总共有多少个K倍区间吗&#xff1f; 输入 ----- 第一…

rust - 计算文件的md5和sha1值

本文提供了一种计算文件md5和sha1的方法。 添加依赖 cargo add file-hashing cargo add md-5 cargo add sha1添加功能函数 use file_hashing::get_hash_file; use md5::Md5; use sha1::{Digest, Sha1}; use std::io::Error; use std::path::Path;pub fn md5<P: AsRef<…

TEMU是什么?TEMU自养号测评有什么优势?

一、 TEMU是什么&#xff1f; TEMU是拼多多于海外线的跨境电商平台&#xff0c;“Temu”这个名字的含义也和拼多多的意思相近。Temu跨境电商自上线以来&#xff0c;下载量不断攀升&#xff0c;发展势头一片大好&#xff0c;击穿地板价的商品在欧美市场掀起了一阵狂潮&#xff…

[每日一氵] 双Ubuntu共享网络

以下是我的记录 两台Ubuntu&#xff0c;名为AB A机有两张网卡&#xff0c;其中一个网卡可上网&#xff0c;另一个空着B机有一张网卡 现在AB直连&#xff0c;假设 eth0 是A连接到互联网的接口&#xff0c;而 eth1 是要连接到服务器B的接口。 将两台服务器通过网线直接连接起…