郑州大学2024年3月招新赛题解

news2024/12/23 10:08:04

1.两重二for循环+维护次大值

这里我就直接用map维护了,多了个logn复杂度还是可以的,下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,a[1010];
map<int,int> mp;
int main(){
	cin>>n;
	int sum=0;
	map<int,int>::iterator it;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n-1;i++){
		mp.clear();
		mp[a[i]]=1;
		for(int j=i+1;j<=n;j++){
			mp[a[j]]=1;
			it=mp.end();
			it--;
			it--;
			sum+=(it->first);
		}
		mp.erase(a[i]);
	}	
	cout<<sum;
} 

2.二分查找+迪杰斯特拉:

显然,我们考虑每一次遍历时的最大体力值a,若a可以,那么比a大的肯定也可,满足单调性。

我们在每次二分时按照体力建图跑个迪杰斯特拉即可,下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,h,w,cnt,head[10101],st,ed,a[10101],max1,min1,ss;
bool vis[10010];
struct node{
	int dian,next,zhi;
}edge[40006];
int xx[20006],yy[20006],ww[20006];
int dis[10101];
void merge(int u,int v,int bb){
	edge[++cnt].dian=v;
	edge[cnt].next=head[u];
	edge[cnt].zhi=bb;
	head[u]=cnt;
}
struct ty{
	int dian,dis1;
	bool operator<(const ty &a) const{
	 return dis1>a.dis1;
	}
};
priority_queue<ty> q;
int dij(int s,int t){
	q.push({s,0});
	while(!q.empty()){
		ty ck=q.top();
		q.pop();
		if(vis[ck.dian]) continue;
		vis[ck.dian]=1;
		for(int i=head[ck.dian];i!=-1;i=edge[i].next){
			int i1=edge[i].dian;
			if(vis[i1]) continue;
			if(dis[i1]>dis[ck.dian]+edge[i].zhi){
				dis[i1]=dis[ck.dian]+edge[i].zhi;
				q.push({i1,dis[i1]});
			}
		}
	}
	if(dis[t]>=1e8) return -1;
	else return dis[t];
}
bool check(int mid){
	cnt=0;
	memset(head,-1,sizeof(head));
	memset(edge,0,sizeof(edge));
	memset(vis,0,sizeof(vis));
	for(int i=1;i<=m;i++){
		if(a[xx[i]]>mid||a[yy[i]]>mid) continue;
		merge(xx[i],yy[i],ww[i]);
		merge(yy[i],xx[i],ww[i]);
	}
	memset(dis,0x7f7f7f7f,sizeof(dis));
	dis[st]=0;
	int yy=dij(st,ed);
	if(yy==-1||yy>h) return 0;
	else return 1;
}
int main(){
	ios::sync_with_stdio(false);
	cin>>n>>m>>st>>ed>>h;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		max1=max(max1,a[i]);
		min1=min(min1,a[i]);
	}
	min1=max(a[st],min1);
	min1=max(a[ed],min1);
	for(int i=1;i<=m;i++) cin>>xx[i]>>yy[i]>>ww[i];
	int i=min1,j=max1;
	int f=0;
	while(i<j){
		int mid=(i+j)/2;
		if(check(mid)){
			f=1;
			 j=mid;
		}
		else i=mid+1;
	}
	if(f==0) cout<<-1;
	else cout<<i;
}

3.模拟:

按照字符串模拟即可,下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,sx,sy,l,dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
char a[5100][5100];
string s;
struct node{
	int x,y;
}tr[2][40];
int main(){
	ios::sync_with_stdio(false);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++) cin>>a[i][j];
	}
	cin>>sx>>sy>>l>>s;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			char c=a[i][j];
			if(c>='A'&&c<='Z'){
				int qq=c-'A';
				if(tr[0][qq].x==0&&tr[0][qq].y==0){
					tr[0][qq].x=i;
					tr[0][qq].y=j;
				}
				else{
					tr[1][qq].x=i;
					tr[1][qq].y=j;
				}
			}
		}
	}
	for(int i=0;i<=s.length()-1;i++){
		int x=sx,y=sy;
		if(s[i]=='L') y--;
		if(s[i]=='R') y++;
		if(s[i]=='U') x--;
		if(s[i]=='D') x++;
		if(a[x][y]=='#') continue;
		if(x<1||y<1||x>n||y>m) continue;
		if(a[x][y]>='A'&&a[x][y]<='Z'){
			int ww=a[x][y]-'A';
			if(tr[0][ww].x==x&&tr[0][ww].y==y){
					sx=tr[1][ww].x;
					sy=tr[1][ww].y;
			}
			else{
				sx=tr[0][ww].x;
				sy=tr[0][ww].y;
			}
		}	
		else{
			sx=x;
			sy=y;
		}
	}
	cout<<sx<<" "<<sy;
}

4.BFS:

发现这道跟洛谷的一道类似,这里就懒一下放个以前洛谷上写的吧:

#include<bits/stdc++.h>
using namespace std;
int n,m,vis[400][400],stx,sty,edx,edy;
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
struct pos{
	int x,y,t;
};
struct node{
	int x,y;
}tr[2][40];
queue<pos> q;
char c,a[400][400];
bool check(int x,int y){
	if(x<1||x>n||y<1||y>m||vis[x][y]==1||a[x][y]=='#') return 0;
	return 1;
}
void bfs(){
	q.push({stx,sty,0});
	vis[stx][sty]=1;
	while(!q.empty()){
		pos ck=q.front();
		q.pop();
		int xx=ck.x,yy=ck.y;
		if(xx==edx&&yy==edy){
			cout<<ck.t;
			return;
		}
		for(int i=0;i<4;i++){
			int xxx=xx+dir[i][0];
			int yyy=yy+dir[i][1];
			if(check(xxx,yyy)==0) continue;
			if(a[xxx][yyy]>'Z'||a[xxx][yyy]<'A'){
				vis[xxx][yyy]=1;
				q.push({xxx,yyy,ck.t+1});
			}
			else{
				int ww=a[xxx][yyy]-'A';
				if(tr[0][ww].x==xxx&&tr[0][ww].y==yyy){
					q.push({tr[1][ww].x,tr[1][ww].y,ck.t+1});
				}
				else q.push({tr[0][ww].x,tr[0][ww].y,ck.t+1});
			}
		}
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>c;
			a[i][j]=c;
			if(c=='@'){
				stx=i;
				sty=j;
			}
			if(c=='='){
				edx=i;
				edy=j;
			}
			if(c>='A'&&c<='Z'){
				int qq=c-'A';
				if(tr[0][qq].x==0&&tr[0][qq].y==0){
					tr[0][qq].x=i;
					tr[0][qq].y=j;
				}
				else{
					tr[1][qq].x=i;
					tr[1][qq].y=j;
				}
			}
		}
	}
	bfs();
}

5.签到题(别被题面吓了)

取字符串最后一位即可。

6.斐波那契数列:

来个矩阵快速幂~~~:

#include<bits/stdc++.h>
using namespace std;
#define int long long
int m,n,mod=1e9+7;
struct node{
	int m[100][100];
}ans,res;
node mul(node a,node b){
	node tmp;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			tmp.m[i][j]=0;
		}
	}
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			for(int k=0;k<n;k++){
				tmp.m[i][j]=(tmp.m[i][j]+a.m[i][k]*b.m[k][j])%mod;
			}
		}
	}
	return tmp;
}
void quickpower(int m,int n){
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			if(i==j) ans.m[i][j]=1;
			else ans.m[i][j]=0;
		}
	}
	while(m){
		if(m&1) ans=mul(ans,res);
		res=mul(res,res);
		m=m>>1; 
	}
}
signed main(){
	cin>>m;
	m-=2;
	n=2;
	res.m[0][0]=0;
	res.m[1][0]=1;
	res.m[1][1]=1;
	res.m[0][1]=1;
	if(m<0) cout<<1;
	else {quickpower(m,n);
	cout<<(ans.m[1][0]+ans.m[1][1])%mod;}
}

7.(不会QAQ...)

8.DP:

我们令dp[i][j][k](k=0/1)表示取到第i个字符,前面转折次数<=j,最后一段是升/降的最长长度。

对于dp[i][j][1],我们遍历1--i-1作为第i个字符的前一个字符,如果比a[i]大,那么就可以直接接在dp[h][j][1]的后面,长度+1,否则可以多加一个转折dp[h][j-1][0]然后+1.对于dp[i][j][0]同理。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,k,dp[1010][1010][2],ans,a[1010];
int main(){
	cin>>n>>k;
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<=n;i++){
		for(int j=0;j<=k;j++){
			dp[i][j][0]=1;
			dp[i][j][1]=1;
			for(int h=1;h<i;h++){
				if(a[h]>a[i]){
					dp[i][j][0]=max(dp[i][j][0],dp[h][j][0]+1);
					if(j>=1) dp[i][j][0]=max(dp[i][j][0],dp[h][j-1][1]+1);
				}
				if(a[h]<a[i]){
					dp[i][j][1]=max(dp[i][j][1],dp[h][j][1]+1);
					if(j>=1) dp[i][j][1]=max(dp[i][j][1],dp[h][j-1][0]+1);
				}
			}
			ans=max(ans,dp[i][j][0]);
			ans=max(ans,dp[i][j][1]);
		}
	}
	cout<<ans;
}

9.模拟:

直接按题目意思模拟即可。

10.贪心:

自己写几个找找规律,可以发现删序列出现递减的前一个数字即可,下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
char num[1000100],x;
bool a[1000100];
int n;
int main(){
	cin>>n;
	for(int i=0;i<=n-1;i++){
		scanf(" %c",&x);
		num[i]=x;}
	if(n==1) cout<<0;
	else if(n==2&&num[1]=='0') cout<<0;
	else{

		int f=0;
		for(int i=0;i<n-1;i++){
			if(num[i]>num[i+1]&&f==0){
				f=1;
				a[i]=1;
				continue;
			}
			
		}
		if(f==0) a[n-1]=1;
		int kkk=0,cnt=0;
		for(int i=0;i<=n-1;i++){
			if(a[i]==1) continue;
			if(kkk==0&&num[i]=='0') continue;
			kkk=1;
			cout<<num[i];
			cnt++;
		}
		if(cnt==0) cout<<0;	
	
	}
}

11.数学

直接BFS就TLE了,我们发现我们按照1,3,6,10.。。取下去,若第一个数==答案或者-2>=答案,我们都可以通过吧一个数改成-1来实现,否则次数+1即可。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,k,t;
void solve(){
	int sum=0,res=0;
	for(int i=1;i<=2000;i++){
		sum+=i;
		if(sum==n||sum-1>n){
			res=i;
			break;
		}
	}
	cout<<res;
}
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		solve();
		cout<<endl;
	}
}

12.前缀和+二分:

#include<bits/stdc++.h>
using namespace std;
int n,q,a[1000100];
long long sum;
long long ss[1000100];
int main(){
	ios::sync_with_stdio(false);
	cin>>n>>q;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++) ss[i]=ss[i-1]+a[i];
	for(int i=1;i<=q;i++){
		cin>>sum;
		int j=lower_bound(ss+1,ss+n+1,sum)-ss;
		if(j==n+1) cout<<-1;
		else printf("%d\n",j);
	}	
}

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

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

相关文章

操作系统--LRU算法,手撕

今天研究一下LRU算法&#xff0c;上学期学数据结构的时候就应该学一下这个算法&#xff0c;不过后面操作系统也会讲到LRU算法 题目 LRU缓存leetocde146 LRU&#xff08;Least Recently Used&#xff0c;最近最少使用&#xff09;算法是一种常见的缓存替换算法&#xff0c;通…

索引失效的介绍和避免方法

索引是什么 在关系数据库 中&#xff0c;索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种 存储结构 &#xff0c;它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。 索引的作用相当于图书的目录&#xff0c;可以根据…

​《宏伟世纪》在 TheSandbox 中带来虚拟苏丹体验!

《宏伟世纪》&#xff08;Magnificent Century&#xff09;与 The Sandbox 合作&#xff0c;将戏剧带入数字领域&#xff01;这部土耳其历史小说电视连续剧以苏丹苏莱曼大帝和许蕾姆苏丹的生平为原型&#xff0c;曾在 140 多个国家和地区播出&#xff0c;收视率超过 5 亿&#…

交换机STP工作原理

文章目录 一、确定交换机角色二、确定端口角色1.根端口选举2.指定端口选举3.非指定端口选举 三、确定端口状态常用查询命令实验拓扑实例一拓扑实例二拓扑实例三拓扑实例四拓扑图实例五 BPDU报文中携带的Root Identifier、Root Path Cost、Bridge Identifier、Port Identifier字…

13年老鸟整理,性能测试技术知识体系总结,从零开始打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 从个人的实践经验…

新质生产力浪潮下,RPA如何成为助力先锋?

新质生产力浪潮下&#xff0c;RPA如何成为助力先锋&#xff1f; 在数字化、智能化的今天&#xff0c;“新质生产力”一词越来越频繁地出现在我们的视野中。那么&#xff0c;究竟什么是新质生产力&#xff1f;它与我们又有什么关系&#xff1f;更重要的是&#xff0c;在这一浪潮…

2024年,10大产业趋势:创新驱动下的全面转型与发展

本趋势指南深入探讨塑造企业创新未来的力量&#xff0c;以及为什么企业必须改变创新方式。指南概述了创新未来的愿景&#xff0c;其中人类智慧和AI技术在创新中相结合&#xff0c;相互补充和放大&#xff0c;这将是一个全新范围的端到端创新平台&#xff0c;旨在将各个点连接起…

用chatgpt写论文重复率高吗?如何降低重复率?

ChatGPT写的论文重复率很低 ChatGPT写作是基于已有的语料库和文献进行训练的&#xff0c;因此在写作过程中会不可避免地引用或借鉴已有的研究成果和观点。同时&#xff0c;由于ChatGPT的表述方式和写作风格与人类存在一定的差异&#xff0c;也可能会导致论文与其他文章相似度高…

Python中Matplotlib保存图像时去除边框(坐标轴、白色边框、透明边框)方法

直接说解决方法&#xff1a; plt.savefig(‘image3.png’,bbox_inches‘tight’,pad_inches0) &#xff08;三行搞定&#xff09; import numpy as np import matplotlib.pyplot as pltimg np.random.randn(10,10)figplt.imshow(img) plt.axis(off) plt.savefig(image3.png,b…

面试题02.07.链表相交

方法一&#xff1a;暴力 public ListNode getIntersectionNode(ListNode headA, ListNode headB) {//先获得链表长度ListNode l1 headA;ListNode l2 headB;int m 0, n 0;while(l1 ! null){m;l1 l1.next;}while(l2 ! null){n;l2 l2.next;}ListNode l3 headA;for(int i …

YOLOv5_seg-Openvino和ONNXRuntime推理【CPU】

纯检测系列&#xff1a; YOLOv5-Openvino和ONNXRuntime推理【CPU】 YOLOv6-Openvino和ONNXRuntime推理【CPU】 YOLOv8-Openvino和ONNXRuntime推理【CPU】 YOLOv7-Openvino和ONNXRuntime推理【CPU】 YOLOv9-Openvino和ONNXRuntime推理【CPU】 跟踪系列&#xff1a; YOLOv5/6/7-O…

Ableton Live 12 Suite:音乐创作的全能工作站 mac版

在数字音乐制作的领域中&#xff0c;Ableton Live 11 Suite 无疑是引领潮流的旗舰产品。作为一款综合性的音乐制作和演出软件&#xff0c;它提供了从创作灵感的萌芽到最终作品完成的全方位解决方案。 Ableton Live 12 Suite Mac版软件获取 Ableton Live 11 Suite 凭借其强大的…

革命性创新:聚道云软件连接器如何为企业重塑财务管理流程?

一、客户介绍 某科技股份有限公司是一家专注于高性能存储技术领域的创新型科技公司。自公司成立以来&#xff0c;该公司始终秉持创新发展的理念&#xff0c;致力于为客户提供卓越的存储解决方案&#xff0c;以满足不同行业对数据存储的需求。作为业界的佼佼者&#xff0c;该公…

47、C++/引用,函数重载,类相关学习20240312

一、自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void show()。 代码&…

系统及其分类

系统定义 系统&#xff1a;指若干相互关联的事物组合而成的具有特定功能的整体。 系统的基本作用&#xff1a;对输入信号进行加工和处理&#xff0c;将其转换为所需要的输出信号。 系统分类 系统的分类错综复杂&#xff0c;主要考虑其数学模型的差异来划分不同类型。主要分为…

【干货详解】接口测试和功能测试有什么区别

本文主要分为两个部分&#xff1a; 第一部分&#xff1a;主要从问题出发&#xff0c;引入接口测试的相关内容并与前端测试进行简单对比&#xff0c;总结两者之间的区别与联系。但该部分只交代了怎么做和如何做&#xff1f;并没有解释为什么要做&#xff1f; 第二部分&#xff1…

jquery-viewer(Viewer.js)—— 一个 jQuery 图片展示插件

用法&#xff1a; <link href"/path/to/viewer.css" rel"stylesheet"> <script src"/path/to/viewer.js"></script>new Viewer(element[, options]) 【element&#xff1a; HTMLElement类型&#xff0c;可以是img元素或包含…

蓝桥杯 - 大石头的搬运工 C++ 前缀和 算法 附Java python

题目 思路和解题方法 这段代码的目标是计算给定点集的最小总移动成本&#xff0c;使得所有点都在同一直线上。它通过计算每个点左边和右边的移动成本&#xff0c;然后在所有可能的分割点中选择最小成本。具体步骤如下&#xff1a; 读取输入的点集&#xff0c;每个点表示为 (y, …

C/C++ 树中王牌:红黑树的结构及实现

一、红黑树的定义 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路 径会比其他路径长出俩倍&#xff…

2024大广赛Canva可画都有哪些命题?

大广赛官网在3月8日发布了2024年Canva可画的命题&#xff0c;Canva可画是全球领先的视觉传播平台&#xff0c;2013年诞生于悉尼&#xff0c;2018年进入中国市场。秉承“赋予世界设计的力量”的使命&#xff0c;Canva可画为用户提供零门槛的设计编辑工具(网页端/App/小程序)&…