河南萌新联赛2024第(六)场:郑州大学(ABCDFGHIL)

news2024/11/24 6:26:15

文章目录

  • 写在前面
  • A 装备二选一(一)
    • 思路
    • code
  • B 百变吗喽
    • 思路
    • code
  • C 16进制世界
    • 思路
    • code
  • D 四散而逃
    • 思路
    • code
  • F 追寻光的方向
    • 思路
    • code
  • G 等公交车
    • 思路
    • code
  • H 24点
    • 思路
    • code
  • I 正义从不打背身
    • 思路
    • code
  • L koala的程序
    • 思路
    • code

河南萌新联赛2024第(六)场:郑州大学

写在前面

昨天打的这场萌新联赛打的也是非常烂,感觉最近不在状态,打比赛总感觉发挥不出自己的水平,可能是集训一个多月都没咋休息了,身心也是有点疲惫,在坚持几天就开学了,在这最后几天在加把劲,多学一点东西总归是好的(菜是原罪QWQ)

A 装备二选一(一)

思路

签到题,假设普通攻击为1并且攻击木桩100次,那么它产生暴击的次数就为 a ∣ c a | c ac 次,比较两次的伤害即可

code

void solve(){
	int a,b,c,d;
	cin >> a >> b >> c >> d;
	int ans1=a*b+(100-a);
	int ans2=c*d+(100-c);
	if(ans2>ans1) cout << "YES";
	else cout << "NO";
	return ;
}

B 百变吗喽

思路

考点:模拟

对于字符串s来说,它只可能比字符串t少一个字符
首先先找出字符串s缺少的字符(若缺少的字符超过1,那么字符串s就不可能等于字符串t,直接输出0)

找到该字符以及该字符在t的位置,这时需要判断它的左右两边是否为相同的字符,若满足则继续判断
每次都将满足的字符的下标存入ans数组里面,最后将ans进行升序排序,输出ans即可

code

void solve(){
	vector<int> ans;
	int k=-1;
	string s,t;
	cin >> s >> t;
	char c;
	for(int i=0;i<s.size();++i){
		if(s[i]!=t[i]){
			k=i;
			c=t[i];
			for(int j=i+1;j<t.size();++j){
				if(t[j]!=s[j-1]){
					cout << 0 << endl;
					return ;
				}
			}
			break;
		}
	}
	if(k==-1){
	  c=t[t.size()-1];
	  k=t.size()-1;	
	} 
	ans.push_back(k);
	int k1=k;
	while(k>0){
		k--;
		if(t[k]==c) ans.push_back(k);
		else break;
	}
	while(k1<t.size()-1){
		k1++;
		if(t[k1]==c) ans.push_back(k1);
		else break;
	}
	sort(ans.begin(),ans.end());
	cout << ans.size() << endl;
	for(auto i : ans) cout << i << " " << c << endl;
	return ;
}

C 16进制世界

思路

考点:背包DP

题目要求月饼的幸福度之和为16的倍数,那么它的价值就为当前幸福度求余16
定义 f [ j ] [ k ] f[j][k] f[j][k] 表示当前背包容量为j并且幸福度为k时,它所容纳的月饼数
显然 f [ 1 − m ] [ 0 ] f[1-m][0] f[1m][0] 是我们答案的区间

考虑状态转移,当前幸福度为k时,它可以由(k+w)%16而来
说明上一步的余数k加上当前幸福度w对16的求余刚好等于k

那么它的状态转移方程就为 f [ j ] [ k ] = m a x ( f [ j ] [ k ] , f [ j − v ] [ ( k + w ) % 16 ] + 1 ) f[j][k]=max(f[j][k],f[j-v][(k+w)\%16]+1) f[j][k]=max(f[j][k],f[jv][(k+w)%16]+1)
这是填表法的做法,还有另一种刷表法的做法 f [ j ] [ ( k + w ) % 16 ] = m a x ( f [ j ] [ ( k + w ) % 16 ] , f [ j − v ] [ k ] + 1 ) f[j][(k+w)\%16]=max(f[j][(k+w)\%16],f[j-v][k]+1) f[j][(k+w)%16]=max(f[j][(k+w)%16],f[jv][k]+1)

code

void solve(){
	int n,m;
	cin >> n >> m;
	vector<vector<int>> f(m+1,vector<int>(16,-inf));
	f[0][0]=0;//初始值
	for(int i=1;i<=n;++i){
		int v,w;
		cin >> v >> w;
		w%=16;
		for(int j=m;j>=v;--j)
			for(int k=0;k<=15;++k){
				f[j][k]=max(f[j][k],f[j-v][(k+w)%16]+1);// 填表法
			//	f[j][(k+w)%16]=max(f[j][(k+w)%16],f[j-v][k]+1); 刷表法
			}
	}
	int ans=0;
	for(int j=0;j<=m;++j) ans=max(ans,f[j][0]);
	cout << ans << endl; 
	return ;
}

D 四散而逃

思路

考点:模拟

把玩一下可以发现,只要序列中的数不全为1,那么所有人都可以逃出去(n=3需要特判,若中间的数为奇数则不满足)
我们只需要遍历一遍数组,若当前数为偶数,那么它需要的操作数就为 a [ i ] / 2 a[i]/2 a[i]/2
若当前数为奇数,那么它需要的操作数就为 a [ i ] / 2 + 1 a[i]/2+1 a[i]/2+1
两者结合,则为 ( a [ i ] + 1 ) / 2 (a[i]+1)/2 (a[i]+1)/2

code

int a[N];
void solve(){
	int n;cin >> n;
	for(int i=1;i<=n;++i) cin >> a[i];
	if(n==3 && a[2]%2){
		cout << -1 << endl;
		return ;
	}
	int flag=1;
	for(int i=2;i<n;++i){
		if(a[i]!=1) flag=0;
	}
	if(flag){
		cout << -1 << endl;
		return ;
	}
	int ans=0;
	for(int i=2;i<n;++i) ans+=(a[i]+1)/2;
	cout << ans << endl;
	return ;
}

F 追寻光的方向

思路

考点:模拟

签到题,遍历一遍数组,每次遍历到当前序列的最大值时,ans++,将前面的序列的数都减去,继续循环,直到循环结束,输出ans

code

int a[N],b[N];
map<int,int> m;
void solve(){
	int n;cin >> n;
	for(int i=1;i<=n;++i){
		cin >> a[i];
		b[i]=a[i];
		m[a[i]]++;
	} 
	int ans=0;
	sort(b+1,b+1+n,greater<int>());
	int l=1; 
	if(b[1]==a[1]) l++;
	m[a[1]]--;
	for(int i=2;i<n;++i){
		if(a[i]==b[l]){
			ans++;
		}
		m[a[i]]--;
		while(m[b[l]]==0 && l<=n) l++;
	}
	cout << ans;
	return ;
}

G 等公交车

思路

考点:贪心+二分

对于每次询问,首先判断最后一班车出发的时间加上到x站的时间是否小于等于t,不满足直接输出TNT
满足则将当时时间t减去到x站的时间,令这个值为d,相当于在出发点查找与之匹配的公交车
查找可以用二分来优化,查找第一个大于等于d的值,然后进行相减即是所需要的时间

code

int a[N],b[N],sum[N];
void solve(){
	int n,m;
	cin >> n >> m;
	for(int i=1;i<=n;++i){
		cin >> a[i];
	} 
	for(int i=1;i<=m;++i) cin >> b[i];
	int q;cin >> q;
	while(q--){
		int t,x;
		cin >> t >> x;
		if(b[m]+a[x]<t) cout << "TNT" << endl;
		else{
			t-=a[x];
			int k=lower_bound(b+1,b+1+m,t)-b;
		    cout << b[k]-t << endl;
		}
	}
	return ;
}

H 24点

思路

考点:模拟

对于这四个数,将它们所有的情况进行排列枚举,由于题目有除法,必然会有精度损失,最后需要判断一下当前的值减去24的绝对值是否小于等于1e-6 即可

code

int a[N],flag=0;
unordered_map<string, int> m = {  
    {"A", 1}, {"2", 2}, {"3", 3}, {"4", 4}, {"5", 5},  
    {"6", 6}, {"7", 7}, {"8", 8}, {"9", 9}, {"10", 10},  
    {"J", 11}, {"Q", 12}, {"K", 13}  
};  
void dfs(vector<double> a){
	if(flag) return ;
	if(a.size()==1){
		if(abs(a[0]-24)<=1e-6) flag=1;
		return ;
	}
	for(int i=0;i<a.size();++i)
	   for(int j=0;j<a.size();++j){
	   	if(i==j) continue;
	   	vector<double> q=a;
	   	q[j]=q[i]+q[j];
	   	q.erase(q.begin()+i);
	   	dfs(q);
	   	q=a;
	   	q[j]=q[i]-q[j];
	   	q.erase(q.begin()+i);
	   	dfs(q);
	   	q=a;
	   	q[j]=q[i]*q[j];
	   	q.erase(q.begin()+i);
	   	dfs(q);
	   	if(q[j]){
	   		q=a;
	   		q[j]=q[i]/q[j];
	   		q.erase(q.begin()+i);
	   	    dfs(q);
		   }
	   }
	return ;
}
void solve(){
	vector<double> a;
	for(int i=0;i<4;++i){
		string s;cin >> s;
		a.push_back(m[s]);
	}
	flag=0;
	dfs(a);
	if(flag) cout << "YES" << endl;
	else cout << "NO" << endl;
	return ;
}

I 正义从不打背身

思路

考点:模拟?

这题需要打表找规律,如图:
假设初始状态为 ‘-’
在这里插入图片描述
很明显,如果m为奇数,奇数项的数在前面,并且它的状态发生改变,偶数项的数在后面,且状态不变
m为偶数,偶数项的数在前面,状态发生改变,奇数项在后面,状态不变

对于超出m的项数,那自然也是不变的

我们只需要按规律模拟即可

code

void solve(){
	int n,m;
	cin >> n >> m;
	string s;cin >> s;
	for(auto &i : s){
		if(i=='P') i='1';
		else i='0';
	}
	s=' '+s;
	string s1=s;
	int l=1,r=m;
	if(m & 1){
		for(int i=m;i>=1;--i){
			if(i & 1) s1[l]=(s[i]=='1'?'0':'1'),l++;
			else s1[r]=(s[i]=='1'?'1':'0'),r--;
		}
	}
	else{
		for(int i=m;i>=1;--i){
			if(!(i & 1)) s1[l]=(s[i]=='1'?'0':'1'),l++;
			else s1[r]=(s[i]=='1'?'1':'0'),r--;
		}
	}
	for(int i=1;i<=n;++i) cout << s1[i] << " ";
	return ;
}

L koala的程序

思路

考点:树状数组 or 线段树

对于这题来说,只需要单点查询,用树状数组更为方便

对于题目的代码和样例,我们不难看出这是一道约瑟夫问题
再看一眼n和k的数据范围,3e5,直接用朴素的算法是过不了的,时间复杂度大致为 O ( n 2 ) O(n^2) On2
一看这数据范围自然得用 O ( n l o g n ) O(nlogn) Onlogn的算法来做,很显然想到树状数组

对于每次选取的位置,我们能想到 ( n o w + m − 1 ) % n (now+m-1)\%n (now+m1)%n (now就是当前位置,m为第几个人出队,n为总人数)
但是这样选取,我们无法取到n的位置

假设一个序列 1 2 3 ,m=3
now初始值为1,(1+3-1)% 3 =0

那么我们可以在取模时做一些技巧,即 ( n o w − 1 + m − 1 ) % n + 1 (now-1+m-1)\%n+1 (now1+m1)%n+1 ,进行一次+1 -1 的操作,这样就能取到n了
每次选取到的数,对于树状数组来说,代表的是前缀和的值(具体讲解看下图)
在这里插入图片描述

具体实现看代码~~

code

int a[N];
int n,m;
void add(int x,int k){
	for(int i=x;i<=n;i+=lowbit(i)){
		a[i]+=k;
	}
}
int sum(int x){
	int ans=0;
	for(int i=x;i;i-=lowbit(i)){
		ans+=a[i];
	}
	return ans;
}
int search(int s){
	int l=1,r=n;
	while(l<r){
		int mid=l+r>>1;
		if(sum(mid)>=s) r=mid;
		else l=mid+1;
	} 
	return l;
}
void solve(){
	cin >> n >> m;
	for(int i=1;i<=n;++i) add(i,1);
	int now=1,op=n;
	while(op>1){
		now=(now-1+m-1)%op+1;
		int ans=search(now);
		cout << ans << " ";
		add(ans,-1);
		op--;
	}
	return ;
}

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

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

相关文章

Transformer总结(二):架构介绍(从seq2seq谈到Transformer架构)

文章目录 一、seq2seq应用介绍二、编码器解码器架构2.1 流程介绍2.2 原理说明 三、Transformer整体结构和处理流程3.1 Attention机制在seq2seq中的引入3.2 比较RNN与自注意力3.3 Transformer架构介绍3.4 处理流程3.4.1 编码器中处理流程3.4.2 解码器在训练阶段和预测阶段的差异…

Linux平台x86_64|aarch64架构RTMP推送|轻量级RTSP服务模块集成说明

系统要求 支持x64_64架构、aarch64架构&#xff08;需要glibc-2.21及以上版本的Linux系统, 需要libX11.so.6, 需要GLib–2.0, 需安装 libstdc.so.6.0.21、GLIBCXX_3.4.21、 CXXABI_1.3.9&#xff09;。 功能支持 Linux平台x64_64架构|aarch64架构RTMP直播推送SDK 音频编码&a…

UDP服务端、TCP的c/s模式

一、UDP服务端 socket bind //绑定 recvfrom ssize_t recvfrom(int sockfd, socket的fd void *buf, 保存数据的一块空间的地址 …

网络编程TCP与UDP

TCP与UDP UDP头&#xff1a; 包括源端口、目的地端口、用户数据包长度&#xff0c;检验和 数据。 typedef struct _UDP_HEADER {unsigned short m_usSourPort;    // 源端口号16bitunsigned short m_usDestPort;    // 目的端口号16bitunsigned short m_usLen…

一款B to B Connector的仿真结果与开发样品实测的结果对比

下面是一款B to B 连接器开发初期的CST仿真结果: 回波损耗 插入损耗 时域阻抗 开发样品出来后第三方测试机构的实测结果

Auto CAD 常用指令汇总 [持续更新]

简介 AutoCAD是由美国Autodesk公司开发的一款自动计算机辅助设计软件&#xff0c;广泛应用于建筑、工程、城市规划等多个领域。自1982年发布以来&#xff0c;AutoCAD不断进化&#xff0c;成为行业标准之一。它支持二维绘图和三维建模功能&#xff0c;用户可以精确绘制各种图形&…

BSCI(Business Social Compliance Initiative)验厂

在当今全球化的经济环境中&#xff0c;企业社会责任&#xff08;Corporate Social Responsibility, CSR&#xff09;已成为衡量企业成功与否的重要标尺之一。而BSCI&#xff08;Business Social Compliance Initiative&#xff09;验厂&#xff0c;作为国际间广泛认可的社会责任…

服务器Ubuntu22.04系统 使用dcocker部署安装ollama和搭配open_webui使用

服务器Ubuntu22.04系统 使用dcocker部署安装ollama和搭配open_webui使用 一、ubuntu和docker基本环境配置 1.更新包列表&#xff1a; 打开终端&#xff0c;输入以下命令&#xff1a; sudo apt-get updatesudo apt upgrade更新时间较长&#xff0c;请耐心等待 2. 安装docke…

[MOCO] Momentum Contrast for Unsupervised Visual Representation Learning

1、目的 无监督表示学习在自然图像领域已经很成功&#xff0c;因为语言任务有离散的信号空间&#xff08;words, sub-word units等&#xff09;&#xff0c;便于构建tokenized字典 现有的无监督视觉表示学习方法可以看作是构建动态字典&#xff0c;字典的“keys”则是从数据&am…

测评了几百款素材管理软件,新手设计师如何进行高效的素材管理?附教程

设计师朋友们&#xff0c;大家在日常工作中肯定积累了各种各样的素材&#xff0c;大家都保存在哪里呢&#xff1f;是散落在电脑磁盘里&#xff0c;还是用一个专门的素材管家管理呢&#xff1f;作为新手设计师&#xff0c;目前是在使用一款经典好用的素材管理软件—Eagle&#x…

Java学习_17_集合综合练习(待更新)

文章目录 前言一、自动点名器二、斗地主小游戏1、准备牌2、洗牌3、发牌4、理牌 总结 前言 博客仅记录个人学习进度和一些查缺补漏。 学习内容&#xff1a;BV17F411T7Ao 部分内容因没有学到&#xff0c;等待后续更新 一、自动点名器 /**** 点名器1&#xff0c;N个学生随机点名…

Edge-TTS:微软推出的,免费、开源、支持多种中文语音语色的AI工具[工具版]

Edge-TTS&#xff0c;由微软推出的这款免费、开源的AI工具&#xff0c;为用户带来了丰富多样的中文语音体验。它不仅支持多种中文语音语色&#xff0c;还能实现流畅自然的语音合成。Edge-TTS凭借其高度可定制化的特点&#xff0c;广泛应用于智能助手、语音播报、教育培训等领域…

商业软件许可证介绍|简单原理探究

个人博客&#xff1a;无奈何杨&#xff08;wnhyang&#xff09; 个人语雀&#xff1a;wnhyang 共享语雀&#xff1a;在线知识共享 Github&#xff1a;wnhyang - Overview 引入话题 既然是商业软件&#xff0c;涉及到商业&#xff0c;那目的就是赚钱。 就拿IDEA举例&#x…

Linux系统中的常见操作命令

目录 命令总结&#xff1a; 一、目录处理命令 二、文件处理命令 三、权限管理命令 四、其它实用命令 命令总结&#xff1a; &#xff08;目录&#xff09; ls [参数] 目录、&#xff08;查看目录&#xff09;pwd、&#xff08;切换目录&#xff09;cd [目录路径]、&…

4.1栈和队列基本概念+经典OJ题

本篇博客来梳理栈和队列基本概念以及一道经典OJ题&#xff0c;题目已插入超链接&#xff0c;点击即可跳转~ 一、栈的相关概念 1&#xff0e;栈 一种特殊的线性表&#xff0c;只允许在固定的一端插入和删除元素&#xff0c;栈中的数据遵循后进先出原则 &#xff08;1&#x…

Pytorch添加自定义算子之(12)-开闭原则设计tensorrt和onnxruntime推理语义分割模型

一、开闭原则 开闭原则是SOLID原则中的一个,指的是尽量使用开放扩展,关闭修改的设计原则。 在C++中如何使用开闭原则导出动态库,可以按照以下步骤进行: 定义抽象基类:定义动态库中的抽象基类,该基类应该封装可扩展的接口。 实现派生类:实现基类的派生类,这些派生类将封…

Vue 导航条+滑块效果

目录 前言代码效果展示导航实现代码导航实现代码导航应用代码前言 总结一个最近开发的需求。设计稿里面有一个置顶的导航条,要求在激活的项目下面展示个下划线。我最先开始尝试的是使用 after 的伪类选择器,直接效果一样,但是展示的时候就会闪现变化,感觉不够自然,参考了一…

继承(下)【C++】

文章目录 子类继承父类之后&#xff0c;子类的默认成员函数的变化构造函数编译器自动生成的构造函数程序员手动写的构造函数 拷贝构造编译器自动生成的拷贝构造函数程序员手动写的拷贝构造函数 赋值重载编译器自动生成的赋值重载程序员手动写的赋值重载 析构函数 继承与友元菱形…

vm安装mac虚拟机

vm安装mac虚拟机 简介实操 简介 教程&#xff1a;完全面向萌新的黑苹果安装教学&#xff1a;黑苹果安装从入门到入白&#xff0c;借助VMware虚拟机给实体机硬盘按照macOS黑苹果系统 实操 下载unlocker&#xff0c;之后运行vm就可以新建mac虚拟机了 新建一个没有选择镜像的…

【Electron】桌面应用开发快速入门到打包Windows应用程序

electron 实现桌面应用开发快速入门到打包Windows应用程序 一、基本介绍 ‌‌Electron 是一个使用‌ JavaScript、‌HTML 和‌ CSS 构建桌面应用程序的框架。它通过将‌Chromium和‌Node.js嵌入到其二进制文件中&#xff0c;允许开发者使用JavaScript代码库创建跨平台的桌面应…