2024CCPC郑州邀请赛暨河南省赛

news2024/11/16 9:41:33

比赛记录:看群里大家嘎嘎拿牌,自己个人来solo了一下,发现简单到中等题很多,写了两小时出了7题,但是写的比较慢,对难题把握还是不准确

补题 : A题确实巧妙充分利用题目的数据范围来思考问题,D简单数数性质推理

A.Once In My Life

数理逻辑推理

题目要求我们构造奇怪的式子得满足出现123456789 + 一个指定的数,给定n要求找到一个k使得n*k符合要求,同时告诉我们 n < 1e8,k<2e10,可以注意到两者的乘积是刚好到达上限1e18级别那么我们如何去思考:我们无非就是想找到一个符合要求的数(1e18)同时是n的倍数->推出k,依照数据范围我们应该是在O(1-log)时间求出答案,我们看如何得到这个数,可以看到1234567890 + d是10位数 后面还可以接上8位数,也就是说这个 + 与n同级别数是可以构造出来的,那么构造完成之后加上快要变成n倍数的余数就是n的倍数了

void solve(){
    
    LL n,d; cin>>n>>d;
    LL ans = 1234567890 + d;
    LL x=n;
    while(x){
    	x/=10;
    	ans *= 10;
    }
    ans += (n-ans%n)%n;
    cout << ans/n << endl;
    return ;
}

B.扫雷1

贪心

我们是从前往后走的,可以得到如果要选择当前这个数必然是因为后面的点都小于等于这个数,否则我直接买后面的更优,所以我们只需要预处理出来后缀最小值即可

int w[N],suf[N];
void solve(){
    cin>>n;
    for(int i=1;i<=n;i++) cin>>w[i];
    suf[n+1]=2e9;
    for(int i=n;i>=1;i--) suf[i]=min(suf[i+1],w[i]);
	
	
	
	int ans=0,cnt=0;
	for(int i=1;i<=n;i++){
		ans++;
		if(ans>=w[i]){
			if(w[i]<=suf[i+1]){
				cnt += ans/w[i];
				ans %= w[i];
			}
		}
	}
	cout << cnt << endl;
    
    return ;
}

D.距离之比

数学推理

我们可以对题目中式子进行推理之后就是两个点之间的横纵坐标构成的三角形的的三角函数之比

\frac{|PQ1|}{|PQ2|} = \sin \theta +\cos \theta = \sqrt 2 \sin (\theta+\frac{\pi }{4})

我们对这个式子研究单调性之后可以得出结论实在45度或者135度的时候结果是最优的所以我们分别按照 x + y 和 x - y排序之后求解相邻两个点的结果即可

PII e[N];
bool cmp1(PII a,PII b){
	return a.x+a.y<b.x+b.y;
}
bool cmp2(PII a,PII b){
	return a.x-a.y<b.x-b.y;
}

double get(PII a,PII b){
	double dx = abs(a.x-b.x),dy = abs(a.y - b.y);
	return 1.0*(dx+dy)/sqrtl((dx*dx+dy*dy));
}
void solve(){
    
    cin>>n;
	for(int i=1;i<=n;i++){
		int x,y; cin>>x>>y;
		e[i]={x,y};
	}    
	
	sort(e+1,e+1+n,cmp1);
	double ans = 0;
	for(int i=1;i<=n;i++){
		int last = i==1 ? n : i-1;
		double now =get(e[i],e[last]);
		ans = max(ans,now);
	}
	
	sort(e+1,e+1+n,cmp2);
	for(int i=1;i<=n;i++){
		int last = i==1 ? n : i-1;
		double now =get(e[i],e[last]);
		ans = max(ans,now);
	}
	cout << LF(11) << ans << endl;
    return ;
}

F.优秀字符串

签到模拟

直接按照题目意思要操作即可

void solve(){
    
    cin>>n;
    int ans = 0;
    while(n--){
    	string s; cin>>s; 
    	if(s.size()!=5) continue;
    	s=' '+s;
    	set<char> S;
    	for(int i=1;i<=4;i++) S.insert(s[i]);
    	if(S.size()!=4) continue;
    	if(s[3]!=s[5]) continue;
    	ans ++ ;
    }
    cout << ans << endl;
    return ;
}

H.随机栈

模拟+概率

要求我们得到的是递增的序列,那么我们取出来的数一定是当前集合最小的数才有可能,同时取出来的数的概率为 cnt[x_{min}]/cnt_{size},用快速幂求逆元,维护集合最小值可以用优先队列,数量开个桶即可

LL qmi(LL a,LL b,LL p){
	LL res = 1;
	while(b){
		if(b&1) res=res*a%p;
		b>>=1;
		a=a*a%p;
	}
	return res;
}
 
LL inv(LL x){
	return qmi(x,mod-2,mod);
}
 
void solve(){
    
    cin>>n;
    priority_queue<int,vector<int>,greater<int>> q;
    vector<int> cnt(N);
    
    LL ans = 1;
    for(int i=1;i<=2*n;i++){
    	int x; cin>>x;
    	if(x!=-1) q.push(x),cnt[x]++;
    	else{
    		int x = q.top();
    		ans *= (LL)cnt[x]*qmi((int)q.size(),mod-2,mod)%mod;
    		ans %= mod;
    		ans = (ans+mod)%mod;
    		a.push_back(x); q.pop();
    		cnt[x]--;
    	}
    }
    int last = -1;
    bool ok = true;
    for(auto&v:a){
    	if(v>=last) last=v;
    	else{
    		ok = false; break;
    	}
    }
    if(!ok){
    	cout << 0 << endl;
    	return ;
    }
    ans = (ans%mod+mod)%mod;
    cout << ans << endl;
    return ;
}

J.排列和组合

暴力 or 小推理

做法1:我们可以发现测试数据不多,我们可以直接跑出全排列即可,可以用素数筛跑出来当前这个数是不是合数

做法2:以0,2,4,5,6,8结尾的一定是合数,由于歌巢原理这六个数至少会出现一个,调整到最后位置即可

int p[N];
bool st[N];
int cnt;
void get(){
	for(int i=2;i<N;i++){
		if(!st[i]) p[cnt++]=i;
		for(int j=0;p[j]<N/i;j++){
			st[i*p[j]]=true;
			if(i%p[j]==0) break;
		}
	}
}
void solve(){
    
    int n = 5;
    int x; cin>>x;
    for(int i=1;i<=n;i++) p[i]=x%10,x/=10;
    sort(p+1,p+1+n);
    do{
    	int now = 0;
    	for(int i=1;i<=n;i++) now = now*10+p[i];
    	if(now<10000) continue;
    	if(st[now]){
    		cout << now << endl;
    		return ;
    	}
    }while(next_permutation(p+1,p+1+n));
    return ;
}

K.树上问题

树形dp

我们首先把1当成根来处理可以发现每一次换根节点只会影响当前这一条边,做个简单树形dp转移即可

vector<int> g[N];
int dp[N];
 
void dfs1(int u,int fa){
	dp[u]= (2*a[u]>=a[fa]);
	for(auto&v:g[u]){
		if(v==fa) continue;
		dfs1(v,u);
		dp[u] += dp[v];
	}
}
void dfs2(int u,int fa){
	if(u!=1) dp[u] = dp[fa] - (2*a[u]>=a[fa]) + (2*a[fa]>=a[u]);
	for(auto&v:g[u]){
		if(v==fa) continue;
		dfs2(v,u);
	}
}
void solve(){
    
    cin>>n;
	for(int i=1;i<=n;i++) g[i].clear(),dp[i]=0;
    for(int i=1;i<=n;i++) cin>>a[i];
	
	for(int i=1;i<n;i++){
		int a,b; cin>>a>>b;
		g[a].push_back(b);
		g[b].push_back(a);
	}  
	dfs1(1,0);
	dfs2(1,0);
	int ans = 0;
	for(int i=1;i<=n;i++) ans += dp[i]==n;
	cout << ans << endl;
    return ;
}

L.Toxel 与 PCPC II

dp处理

我们可以发现对于当前点一定就是从前面几个点转移过来的,也就是说从上一次的最优情况到当前我和前面那几个一起,我们发现由于x^4很大,所以转移的次数不是很大简单论证一下就是n开四次方即可,我们可以处理到30,这样我们来定义dp[i][j]为当前处理到第i个数,处理第i个的时候是一次性处理j个以前debug的,时间复杂度就是30n

LL dp[N][32];
LL d[N];
 
void solve(){
    
    cin>>n>>m;
    for(int i=1;i<=m;i++) cin>>a[i];
   	
   	for(int i=1;i<=m;i++){
   		d[i]=2e18;
   		for(int j=1;j<=i and j<=30;j++){
   			dp[i][j]=d[i-j]+a[i]+(LL)j*j*j*j;
   			d[i]=min(d[i],dp[i][j]);
   		}
   	}
   	cout << d[m] << endl;
    return ;
}

M.有效算法

二分

依照题目意思我们发现明显的具有二分性质,接下来思考如何check我们直接依照式子推导可以得到a_i - k*b_i <= x <= a_i + k*b_i

对于每一个a,b可以得到一个区间,也就是所有的区间要有一个交点即可,也就是最大的右端点要小于最小的左端点

LL a[N],b[N];
 
void solve(){
    
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++) cin>>b[i];
    
    auto check = [&](LL k){
    	LL l=-2e18,r=2e18;
    	for(int i=1;i<=n;i++){
    		l=max(l,a[i]-k*b[i]);
    		r=min(r,a[i]+k*b[i]);
    	}
    	return l<=r;
    };
    
    LL l = 0 ,r = 1e9;
    while(l<r){
    	LL mid = l+r>>1;
    	if(check(mid)) r=mid;
    	else l=mid+1;
    }
    cout << l << endl;
    return ;
}

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

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

相关文章

Python邮件处理库之flanker使用详解

概要 Flanker是一个开源的邮件处理库,专门设计用于解析、验证和构建电子邮件地址和MIME消息。由Mailgun开发,它旨在提高邮件处理的效率和准确性,尤其适用于需要高效邮件验证和解析的应用程序。 安装 安装Flanker非常简单,可以通过Python的包管理器pip进行安装: pip ins…

GRE over IPsec VPN实验

一、拓扑图 二、组网需求 某企业总部、分支1、分支2分别通过 R1&#xff0c;R3&#xff0c;R4 接入互联网&#xff0c;配置默认路由连通公网按照图示配置 IP 地址&#xff0c;R1&#xff0c;R3&#xff0c;R4 分别配置 Loopback0 口匹配感兴趣流&#xff0c;Loopback1 口模拟业…

微软推出的Microsoft Fabric 到底是什么?

近期&#xff0c;总有客户问小编&#xff0c;微软推出的 Microsoft Fabric 是什么&#xff1f;这个产品有什么特别之处呢&#xff1f;希望下面这篇文章能为大家解开一些疑惑。 微软Fabric是2023年5月推出的一个数据分析平台&#xff0c;它将关键数据管理和分析工作负载整合到一…

Docker 使用 CentOS 镜像

使用 docker run 直接运行 CentOS 7 镜像&#xff0c;并登录 bash。 C:\Users\yhu>docker run -it centos:centos7 bash Unable to find image centos:centos7 locally centos7: Pulling from library/centos 2d473b07cdd5: Pull complete Digest: sha256:be65f488b7764ad36…

力扣HOT100 - 139. 单词拆分

解题思路&#xff1a; 动态规划 class Solution {public boolean wordBreak(String s, List<String> wordDict) {Set<String> wordDictSet new HashSet(wordDict);boolean[] dp new boolean[s.length() 1];dp[0] true;for (int i 1; i < s.length(); i) {…

数图智能营运管理系统助力企业数字化转型升级

数图智能营运管理系统不仅仅是一个业绩查看工具&#xff0c;它还具备了主动预警机制以及专家级的品类分析逻辑。系统能够协助企业持续优化库存管理&#xff0c;提升品类结构合理性&#xff0c;显著提高运营效率&#xff0c;减少对员工专业技能的依赖&#xff0c;并缩短处理时间…

数据库管理-第190期 备份堪比生死(20240515)

数据库管理190期 2024-05-15 数据库管理-第190期 备份堪比生死&#xff08;20240515&#xff09;1 DDL误操作2 强大的RMAN3 ZDLRA总结 数据库管理-第190期 备份堪比生死&#xff08;20240515&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文&#xff09; Oracle A…

HTTP协议及应用

一.HTTP协议 1.HTTP协议版本 HTTP1.0&#xff1a;服务器处理完成后立即断开TCP连接&#xff08;无连接&#xff09;&#xff0c;服务器不跟踪每个客户端也不记录过去的请求&#xff08;无状态&#xff09;&#xff1b; HTTP1.1&#xff1a;KeepAlived长连接避免了连接建立和…

《Mybatis》系列文章目录

什么是 MyBatis&#xff1f; MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff…

03 Linux编程-进程

1、进程的相关概念 1.1 程序与进程 程序是静态的概念&#xff0c;进程是程序的一次运行活动。 1.2 查看系统中有哪些进程 ps #只显示一小部分进程 ps -aux #会打印当前所有进程 ps -aux|grep init #使用grep筛选出只含有init的进程top #运行显示的进程有点类似windows…

5.12学习总结

一.JAVA聊天室项目 文件发送 使用 Java Socket 实现聊天内容或文件的传输的原理如下&#xff1a; 服务器端启动&#xff1a;聊天室的服务器端在指定的端口上监听客户端的连接。它创建一个 ServerSocket 对象&#xff0c;并通过调用 accept() 方法等待客户端的连接请求。客户…

GPT5 如何使用?GPT5 如何订阅?GPT5 功能全面详解

结论是&#xff1a;GPT2 很糟糕 &#xff0c;GPT3 很糟糕 &#xff0c;GPT4 可以 &#xff0c;但 GPT5 会很好。 ChatGPT5今年发布 GPT5发布的具有推理功能的不断发展&#xff0c;就像 iPhone 一样。 Sam Altman 于 17 日&#xff08;当地时间&#xff09;&#xff0c;在世界…

【数据结构】数据结构大汇总 {数据结构的分类总结:定义和特性、实现方式、操作与复杂度、适用场景、相关算法、应用实例}

一、线性结构 1.1 顺序表 定义和特性&#xff1a;顺序表是一种线性表的存储结构&#xff0c;它采用一段地址连续的存储单元依次存储线性表中的元素。顺序表具有随机访问的特性&#xff0c;即可以通过元素的下标直接访问元素。 实现方式&#xff1a;顺序表可以通过数组来实现&…

初识C++ · string的使用(2)

目录 1 Modifiers部分 1.1 assign的使用 1.2 insert的使用 1.3 erase的使用 1.4 replace的使用 2 capacity部分 2.1 max_size的使用 2.2 capacity的使用 2.3 reserve的使用 2.4 shrink_to_fit简介 2.5 resize的使用 2.6 clear的使用 3 String operations部分 3.1 …

Python查询和操作HTML文档库之pyquery使用详解

概要 在Web开发和数据抓取中,处理HTML文档是一项常见任务。Python的pyquery库提供了一个强大且灵活的方式来查询和操作HTML文档,类似于jQuery的语法。通过这篇文章,将深入了解pyquery的安装、特性、基本和高级功能,以及它在实际应用中的用例。 安装 安装pyquery相当简单,…

3、用Vue快雕塑搭建一个管理系统的页面布局框架

3.2.顶部栏header 在el-header标签里对标签栏header进行样式定义 <template><div id"app"><el-container><el-header style"background-color: #4c535a"><img src"/assets/logo.png" alt"" style"w…

做一个犬榜小程序,警示社会。

2024-5-15新闻&#xff1a;流浪狗咬死3岁男童。 相关链接&#xff1a;3岁男童被恶犬咬伤离世 母亲发声 急寻狗主讨公道_中华网 恶狗的主人终于付出代价 链接&#xff1a;这回&#xff0c;恶狗的主人终于付出代价 - 知乎 7岁女童家门口玩耍被恶犬咬伤头面部&#xff0c;多处撕…

深⼊理解指针(5)

目录 1. 回调函数是什么&#xff1f;1.1 使用回调函数修改 2. qsort使⽤举例2.1 使⽤qsort函数排序整型数2.2 使⽤qsort排序结构数据按年龄排序2.3 使⽤qsort排序结构数据按名字排序2.4整体代码 3. qsort函数的模拟实现3.1 整型数组的实现3.2 结构体按名字排序实现3.3 结构体按…

企业开发(日期格式处理)——注解 @JsonFormatvs VS 消息转换器?

在企业级应用程序开发中&#xff0c;日期是一个常见但又容易被忽视的问题。正确处理日期格式对于系统的正确性和用户体验至关重要。在本文中&#xff0c;我们将探讨两种常见的方式来处理日期格式&#xff1a;通过注解和通过扩展Spring MVC的消息转换器&#xff0c;以及它们各自…

Python-VBA函数之旅-zip函数

目录 一、zip函数的常见应用场景 二、zip函数使用注意事项 三、如何用好zip函数&#xff1f; 1、zip函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;https://myelsa1024.blog.csdn.net/ 一、zip函数的常见…