第七届传智杯全国IT技能大赛程序设计赛道 国赛(总决赛)—— (B组)题解

news2025/4/22 16:40:37

1.小苯的木棍切割

【解析】首先我们先对数列排序,找到其中最小的数,那么我们就保证了对于任意一个第i+1个的值都会大于第i个的值那么第i+2个的值也比第i个大,那么我们第i+1次切木棍的时候一定会当第i个的值就变为了0的,第i+1减去的应该是第i个的值与第i-1个的差值,对于i+1到n同样如此,那么我们的递推关系就出来了,每次都切去的值都是(第i个跟第i-1个的差值)*(n-i+1)那么我们就可以用差分来写。

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10; 
int t;
int a[N];
int b[N];
int main(){
cin>>t;
for(int i=0;i<t;i++){
	int n;
	cin>>n;
	memset(b,0,sizeof(b));
	memset(a,0,sizeof(a));
	for(int i=1;i<=n;i++)
	{  
	cin>>a[i];
	}
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++){
	b[i]=a[i]-a[i-1];
	} 
	long long max=0;//不开long long 见祖宗!!!
	for(int i=1;i<=n;i++){
	if(max<b[i]*(n-i+1)){
	max=b[i]*(n-i+1); 
	} 	
	}
	cout<<max<<endl;
}	
}

2.大苯营

【解析】可以全部转化为等腰三角形来求解,我们经过观察得知当当x 和 y 的二进制没有任何交集时(即x&y=0 时),x∣y=x⊕y。位运算来解。

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin>>n;
	while(n--){
		int x;
		cin>>x;
		int y=0;
//全部转化为2的30次方的操作
		for(int i = 30; i >= 0; i--) {
        if(x >> i & 1) {
            
        } else {
            y |= (1LL << i);
        }
    }
		if(y==0)
		cout<<-1<<endl;
		else cout<<y<<endl;
		
	}
}

3.小苯的排列数

【解析全排列题但是如果仅仅只是用dfs来进行全排列的话会超时。看题目范围,用dfs全枚举一边的时间是1!+2!+...+9!大概是4*10^5的时间复杂度。那么我们用dfs进行预处理,接着用二分以logn的复杂度来进行查找枚举。

#include<bits/stdc++.h>
using namespace std;
vector<int> v;
bool st[15];
int h=0;
int kk; 	
int l,r;
//dfs进行预处理
void dfs(int x,int y,int kk){
if(x==y){
	v.push_back(kk);
	return ;
}
for(int i=1;i<=y;i++){
	if(!st[i]){
	st[i]=true;
	dfs(x+1,y,kk*10+i);
	st[i]=false;	
	}
}	
}
//二分查找
void slove(){
 int lk=-1,rk=v.size();
	 while(lk+1<rk){
	 	int mid=(lk+rk)/2;
	 if(v[mid]<l)
	 lk=mid;
	 else rk=mid;	
	 }
	 if(v[lk]>=l&&v[lk]<=r)
	 cout<<v[lk]<<endl;
	 else if(v[rk]>=l&&v[rk]<=r)
	 cout<<v[rk]<<endl;
	 else cout<<-1<<endl;	
}
int main(){
	int t;
	cin>>t;
	 for(int i=1;i<=9;i++)
	 dfs(0,i,0);
	 while(t--){
	 	cin>>l>>r;
		slove();
	 }
}

4.小苯的字符串染色

【解析】

#include<bits/stdc++.h>
#define int long long
using namespace std;
void solve() {
	int n, k;
	cin >> n >> k;
	getchar();
	string str;
	getline(cin, str);
//取 k 和 n - k 中的较小值,因为找出包含 k 个 0 的子串和包含 n - k 个 1 的子串是等价的。
	k = min(k, n - k);
	int ret  = 0;
	for(int left = 0, right = 0, cnt = 0; right < n; right++) {
		if(str[right] == '1') cnt++;
		if(cnt < k) continue;
		while(cnt > k && left <= right) {
			if(str[left] == '1') cnt--;
			left++;
		}
		if(cnt == k) ret = max(ret, right - left + 1);
	}	

	for(int left = 0, right = 0, cnt = 0; right < n; right++) {
		if(str[right] == '0') cnt++;
		if(cnt < k) continue;
		while(cnt > k && left <= right) {
			if(str[left] == '0') cnt--;
			left++;
		}
		if(cnt == k) ret = max(ret, right - left + 1);
	}	
	cout << ret << "\n";
}
signed main() {

	int t ;
	cin >> t;
	while(t--) {
		solve();
	}
}

5.小苯的物理小球

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int>PII;

#define fi first
#define se second
#define all(ss) ss.begin(),ss.end()
#define pb push_back
#define vi vector<int>
#define vii vector<vector<int>>
#define vl vector<LL>
#define vll vector<vector<LL>>
#define i128 __int128

int const B=507;
double const eps=1e-6;
int const mod=998244353;
int const N=2e5+7,M=N*50;
int const INF=0x3f3f3f3f;
LL const INFF=0x3f3f3f3f3f3f3f3f;

int n,m;
int x,y,z;
int ls[M],rs[M],tot,root;
LL sum[M],tag[M];


void pushup(int u){
	sum[u]=sum[ls[u]]+sum[rs[u]];
}
void pushdown(int u,int l,int r){
	if(tag[u]==-1) return;
	if(ls[u]==0) ls[u]=++tot;
	if(rs[u]==0) rs[u]=++tot;
	int mid=(l+r)>>1;
	sum[ls[u]]=tag[u]*(mid-l+1);
	sum[rs[u]]=tag[u]*(r-mid);
	tag[ls[u]]=tag[u];
	tag[rs[u]]=tag[u];
	tag[u]=-1;
}
void modify(int &u,int l,int r,int x,int y,LL k){
	if(u==0) u=++tot;
	if(x<=l&&r<=y){
		sum[u]=k*(r-l+1);
		tag[u]=k; return;
	}
	pushdown(u,l,r);
	int mid=(l+r)>>1;
	if(mid>=x) modify(ls[u],l,mid,x,y,k);
	if(y>mid) modify(rs[u],mid+1,r,x,y,k);
	pushup(u);
}

int query(int &u,int l,int r,int p){
	if(u==0) u=++tot;
	if(l==r){
		if(sum[u]==-1) sum[u]=r;	//没有初始化,则帮他初始化
		return sum[u];
	}
	pushdown(u,l,r);
	int mid=(l+r)>>1;
	if(mid>=p) return query(ls[u],l,mid,p);
	return query(rs[u],mid+1,r,p);
}

LL qpow(LL a,LL b=mod-2,int p=mod){   //快速幂
	LL res=1%p;
	a%=p; 	//注意这个幂数b,不可以取模
	while(b){
		if(b&1)	res=res*a%p;
		a=a*a%p; b/=2;
	}
	return res;
}
/*
对线段高度从低到高考虑,每次计算当前线段的期望值
从小到大枚举高度,看当前线段的两端点会落在那里,
如果会落在更低的线段,直接转移过来,并且除2
如果会落在地方,就是用横坐标除2

然后就是要维护x轴的每一个端点,直接开数组维护,空间时间都会爆
所以,我用的是动态开点线段树,维护值域
*/

void solve(){
	scanf("%d%d",&n,&m);
	int mx=0;
	vector<array<int,3>>a;
	for(int i=0;i<n;i++){
		scanf("%d%d%d",&x,&y,&z);
		a.pb({z,x,y});
		mx=max(mx,x);
		mx=max(mx,y);
	}
	vector<array<int,2>>q;
	for(int i=0;i<m;i++){
		scanf("%d%d",&x,&y);
		q.pb({y,x});
		mx=max(mx,x);
	}
	sort(all(a));
	sort(all(q));
	
	
	LL ans=0;
	LL inv2=qpow(2);
	int j=0;
	for(int i=0;i<n;i++){
		//q[j]的高度更小
		while(j<m&&q[j][0]<a[i][0]){ //a数组无法影响d数组了
			int id=q[j][1];
			ans=(ans+query(root,1,mx,id))%mod;
			j++;
		}
		int x=a[i][1],y=a[i][2];	
		LL v1=query(root,1,mx,x);
		LL v2=query(root,1,mx,y);
	
		LL t=(v1+v2)*inv2%mod;
		if(x+1<=y-1&&y-1<=mx) modify(root,1,mx,x+1,y-1,t);
	}

	while(j<m){ 	//累加没有计算的
		int id=q[j][1];
		ans=(ans+query(root,1,mx,id))%mod;
		j++;
	}
	cout<<ans<<"\n";
	for(int i=0;i<=tot;i++) ls[i]=rs[i]=0,sum[i]=tag[i]=-1;
	root=tot=0;
}


void init(){
	memset(tag,-1,sizeof tag);
	memset(sum,-1,sizeof sum);
}

int main()
{
    init();
    int T;
    scanf("%d",&T);

   	for(int i=1;i<=T;i++){
	   	solve();
	}

	return 0;
}

6.小苯的地下城寻宝

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10,M=N*2,mod=998244353;
#define int long long
const long long inf=1e18;
const long long INF=1e18;
typedef pair<int,int> PII;
typedef long long LL;
using node=tuple<int,int,int>;
int n,m,k;
vector<int> coef(N,1);
vector<int> d[N];
void init(){
    coef[1]=0;
    for(int i=1;i<=100000;i++){
        for(int j=i;j<=100000;j+=i)
        {
            d[j].push_back(i);
            if(j>i)coef[j]-=coef[i];
        }
    }
}
vector<int> g[N];
vector<int> dep[N];
int f[N],a[N];
int mx;
void dfs(int u,int fa,int depth){
    dep[depth].push_back(u);
    mx=max(mx,depth);
    for(auto v:g[u]){
        if(v!=fa){
            dfs(v,u,depth+1);
        }
    }
}
void solve()
{
    cin>>n;
    for(int i=1;i<=n;i++) g[i].clear(),dep[i].clear(),f[i]=0;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++){
        int x;cin>>x;
        if(x>0){
            g[i].push_back(x);
            g[x].push_back(i);
        }
    }
    mx=0;
    dfs(1,0,1);
    unordered_map<int,int>mp;
    f[1]=1;
    for(auto x:d[a[1]])mp[x]+=f[1];
    int res=1;
    for(int i=2;i<=mx;i++){
        for(auto v:dep[i]){
            for(auto x:d[a[v]]){
                f[v]=(f[v]+mp[x]*coef[x]%mod)%mod;
                f[v]=(f[v]%mod+mod)%mod;
            }
            res=(res+f[v])%mod;
        }
        for(auto v:dep[i]){
            for(auto x:d[a[v]]){
                mp[x]=(mp[x]+f[v])%mod;
            }
        }
    }
    cout<<res<<"\n";
}   

signed main()
{
    cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
    int t=1;
    init();
  //  freopen("in.txt","r",stdin); //输入重定向,输入数据将从D盘根目录下的in.txt文件中读取 
//	freopen("out.txt","w",stdout); //输出重定向,输出数据将保存在D盘根目录下的out.txt文件中 
    cin>>t;
    while(t--) solve();
}

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

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

相关文章

Netty前置基础知识之BIO、NIO以及AIO理论详细解析和实战案例

前言 Netty是什么&#xff1f; Netty 是一个基于 Java 的 ​高性能异步事件驱动网络应用框架&#xff0c;主要用于快速开发可维护的协议服务器和客户端。它简化了网络编程的复杂性&#xff0c;特别适合构建需要处理海量并发连接、低延迟和高吞吐量的分布式系统。 1)Netty 是…

开源身份和访问管理(IAM)解决方案:Keycloak

一、Keycloak介绍 1、什么是 Keycloak&#xff1f; Keycloak 是一个开源的身份和访问管理&#xff08;Identity and Access Management - IAM&#xff09;解决方案。它旨在为现代应用程序和服务提供安全保障&#xff0c;简化身份验证和授权过程。Keycloak 提供了集中式的用户…

深入理解 TCP 协议 | 流量、拥塞及错误控制机制

注&#xff1a;本文为 “TCP 协议” 相关文章合辑。 原文为繁体&#xff0c;注意术语描述差异。 略作重排&#xff0c;如有内容异常&#xff0c;请看原文。 作者在不同的文章中互相引用其不同文章&#xff0c;一并汇总于此。 可从本文右侧目录直达本文主题相关的部分&#xff…

VSCode远程图形化GDB

VSCode远程图形化GDB 摘要一、安装VSCode1、使用.exe安装包安装VSCode2、VSCode 插件安装3、VSCode建立远程连接 二、core dump找bug1、开启core文件2、永久生效的方法3、编写测试程序4、运行结果5、查看core段错误位置6、在程序中开启core dump并二者core文件大小 三、gdbserv…

软件工程师中级考试-上午知识点总结(上)

我总结的这些都是每年的考点&#xff0c;必须要记下来的。 1. 计算机系统基础 1.1 码 符号位0表示正数&#xff0c;符号位1表示负数。补码&#xff1a;简化运算部件的设计&#xff0c;最适合进行数字加减运算。移码&#xff1a;与前几种不同&#xff0c;1表示&#xff0c;0表…

基于FreeRTOS和STM32的微波炉

一、项目简介 使用STM32F103C8T6、舵机、继电器、加热片、蜂鸣器、两个按键、LCD及DHT11传感器等硬件。进一步&#xff0c;结合FreeRTOS和状态机等软件实现了一个微波炉系统&#xff1b;实现的功能包含&#xff1a;人机交互、时间及功率设置、异常情况处理及固件升级等。 二、…

国防科大清华城市空间无人机导航推理!GeoNav:赋予多模态大模型地理空间推理能力,实现语言指令导向的空中目标导航

作者&#xff1a; Haotian Xu 1 ^{1} 1, Yue Hu 1 ^{1} 1, Chen Gao 2 ^{2} 2, Zhengqiu Zhu 1 ^{1} 1, Yong Zhao 1 ^{1} 1, Yong Li 2 ^{2} 2, Quanjun Yin 1 ^{1} 1单位&#xff1a; 1 ^{1} 1国防科技大学系统工程学院&#xff0c; 2 ^{2} 2清华大学论文标题&#xff1a;Geo…

uniapp打ios包

uniapp在windows电脑下申请证书并打包上架 前言 该开发笔记记录了在window系统下&#xff0c;在苹果开发者网站生成不同证书&#xff0c;进行uniapp打包调试和上线发布&#xff0c;对window用户友好 注&#xff1a;苹果打包涉及到两种证书&#xff1a;开发证书 和 分发证书 …

快速搭建 Cpolar 内网穿透(Mac 系统)

1、Cpolar快速入门教程&#xff08;官方&#xff09; 链接地址&#xff1a;Cpolar 快速入门 2、官方教程详解 本地安装homebrew /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"这个是从 git 上拉取的&#x…

动态监控进程

1.介绍: top和ps命令很相似,它们都是用来显示正在执行的进程,top和ps最大的不同之处,在于top在执行中可以更新正在执行的进程. 2.基本语法&#xff1a; top [选项] 选项说明 ⭐️僵死进程&#xff1a;内存没有释放,但是进程已经停止工作了,需要及时清理 交互操作说明 应用案…

HADOOP 3.4.1安装和搭建(尚硅谷版~)

目录 1.配置模版虚拟机 2.克隆虚拟机 3.在hadoop102安装JDK 4.完全分布式运行模式 1.配置模版虚拟机 1.安装模板虚拟机&#xff0c;IP地址192.168.10.100、主机名称hadoop100、内存2G、硬盘20G&#xff08;有需求的可以配置4G内存&#xff0c;50G硬盘&#xff09; 2.hado…

第 4 篇:平稳性 - 时间序列分析的基石

第 4 篇&#xff1a;平稳性 - 时间序列分析的基石 在上一篇中&#xff0c;我们学习了如何将时间序列分解为趋势、季节性和残差。我们看到&#xff0c;很多真实世界的时间序列&#xff08;比如 CO2 浓度&#xff09;都包含明显的趋势&#xff08;长期向上或向下&#xff09;和/…

DeepSeek赋能Nuclei:打造网络安全检测的“超级助手”

引言 各位少侠&#xff0c;周末快乐&#xff0c;幸会幸会&#xff01; 今天唠一个超酷的技术组合——用AI大模型给Nuclei开挂&#xff0c;提升漏洞检测能力&#xff01; 想象一下&#xff0c;当出现新漏洞时&#xff0c;少侠们经常需要根据Nuclei模板&#xff0c;手动扒漏洞文章…

从0到1彻底掌握Trae:手把手带你实战开发AI Chatbot,提升开发效率的必备指南!

我正在参加Trae「超级体验官」创意实践征文&#xff0c; 本文所使用的 Trae 免费下载链接&#xff1a; www.trae.ai/?utm_source… 前言 大家好&#xff0c;我是小Q&#xff0c;字节跳动近期推出了一款 AI IDE—— Trae&#xff0c;由国人团队开发&#xff0c;并且限时免费体…

opencv图片颜色识别,颜色的替换

图片颜色识别 1. RGB颜色空间2. 颜色加法2.1使用numpy对图像进行加法2.2使用opencv加法&#xff08;cv2.add&#xff09; 3 颜色加权加法&#xff08;cv2.addWeighted()&#xff09;4. HSV颜色空间5. 制作掩膜4. 与运算&#xff08;cv2.bitwise_and&#xff09;5.颜色的替换7 R…

B实验-12

需要注意版本、页面源代码 两个文件一个目录&#xff1a;phpinfo robots phpmyadmin 实验12 靶机1 一个key在phpmyadmin&#xff0c;一个key在回收站 用两个扫描目录的工具扫&#xff0c;nmap给python版 情况1&#xff1a;弱口令 root root root 123456 …

【网工第6版】第5章 网络互联②

目录 ■ IPV6 ▲ IPV6报文格式 ◎ IPV6扩展报头&#xff08;RFC2460&#xff09; ◎ IPv6相关协议 ▲ IPV6地址分类 ◎ IPv6地址基础 ◎ IPv6地址举例 ◎ IPv6地址分类 ◎ 特殊地址对比IPv4 vs IPv6 ▲ 过渡技术 本章重要程度&#xff1a;☆☆☆☆☆ ■ IPV6 与IPv4…

单页面应用的特点,什么是路由,VueRouter的下载,安装和使用,路由的封装抽离,声明式导航的介绍和使用

文章目录 一.什么是单页面应用?二.什么是路由?生活中的路由和Vue中的路由 三.VueRouter(重点)0.引出1.介绍2.下载与使用(5个基本步骤2个核心步骤)2.1 五个基本步骤2.2 两个核心步骤 四.路由的封装抽离五.声明式导航1.导航链接特点一:能跳转特点二:能高亮 2.两个高亮类名2.1.区…

STM32---外部中断EXTI

目录 一、中断向量表 二、EXTI工作原理图 三、NVIC模块 四、GPIO设置为EXTI的结构 五、C语言示例代码 在STM32中&#xff0c;中断是一个非常重要的结构&#xff0c;他能让我们在执行主函数的时候&#xff0c;由硬件检测一些外部或内部产生的中断信号&#xff0c;跳转到中断…

Itext进行PDF的编辑开发

这周写了一周的需求&#xff0c;是制作一个PDF生成功能&#xff0c;其中用到了Itext来制作PDF的视觉效果。其中一些功能不是很懂&#xff0c;仅作记录&#xff0c;若要学习请仔细甄别正确与否。 开始之前&#xff0c;我还是想说&#xff0c;这傻福需求怎么想出来的&#xff0c…