第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组(部分题解)

文章目录

  • 1 子2023
    • 思路:
    • 代码:
  • 2 双子数
    • 思路:
    • 代码:
  • 3 班级活动
    • 思路:
    • 代码:
  • 4 合并数列
    • 思路:
    • 代码:
  • 5 数三角
    • 思路:
    • 代码:
  • 7 AB路线
    • 思路:
    • 代码:
  • 8 抓娃娃
    • 思路:
    • 代码:


1 子2023

思路:

  • 比较基础的线性dp

代码:

#include<bits/stdc++.h>
using namespace std;#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl '\n'
#define int long long
#define fi first
#define se second
#pragma GCC optimize(2)
#pragma GCC optimize("inline")
typedef pair<int,int> PII;
const int N = 1e3+10, INF = 0x3f3f3f3f;
int n=2023,ans;
string s="";
int dp[3];
//dp[0]:当前位置之前"2"的个数
//dp[1]:当前位置之前"20"的个数
//dp[2]:当前位置之前:"202"的个数 void solve(){for(int i=1;i<=n;i++) s+=to_string(i);for(int i=0;i<s.size();i++){if(s[i]=='2') dp[0]++,dp[2]+=dp[1]; //2,202else if(s[i]=='0') dp[1]+=dp[0];//20else if(s[i]=='3') ans+=dp[2];//202加上当前位置的3 } cout<<ans; //5484660609
}signed main(){int T=1;
//	IOS;
//	cin>>T;while(T--){solve();} return 0;
}

2 双子数

思路:

  • 欧拉筛求素数,然后枚举所有素数,找到满足条件的
  • 记得超出范围时要及时break,不然会爆long long

代码:

#include<bits/stdc++.h>
using namespace std;#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl '\n'
#define int long long
#define fi first
#define se second
typedef pair<int,int> PII;
const int N = 5e6+10, INF = 0x3f3f3f3f;
int L=2333,R=23333333333333; 
int ans;
int prime[N],cnt;
bool isprime[N];
set<int> s;void get_prime(){memset(isprime,1,sizeof(isprime));isprime[1]=0;for(int i=2;i<N;i++){if(isprime[i]) prime[++cnt]=i;for(int j=1;j<=cnt&&i*prime[j]<N;j++){isprime[i*prime[j]]=0;if(i%prime[j]==0) break;}}
}void solve(){get_prime();for(int i=1;i<=cnt;i++){int res=prime[i]*prime[i]*prime[i+1]*prime[i+1];if(res>R) break; //及时break,不然会溢出long long!!!for(int j=i+1;j<=cnt;j++){int res=prime[i]*prime[i]*prime[j]*prime[j];if(res>=L&&res<=R) ans++;if(res>R) break;}}cout<<ans; //947293
}signed main(){int T=1;
//	IOS;
//	cin>>T;while(T--){solve();} return 0;
}

3 班级活动

思路:

  • 认真读题,题目中说了“有且仅有一名同学”,也是就是说两两相同,每对数之间是不同的
  • 所以id个数大于2的部分都是要修改的,根据贪心的思想,我们更希望把这些多出的部分和单个的id来配对!
  • 所以分为两类,多出的部分sum1,和单个的sum2,比较那个大
  • sum1>=sum2,把多出的部分修改为和单个的id相同的id,然后把剩下的sum1全都修改
  • sum1<sum2,就把多出的部分修改为和单个的id相同的id,然后把剩下的sum2修改一半即可!

代码:

#include<bits/stdc++.h>
using namespace std;#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl '\n'
#define int long long
#define fi first
#define se second
typedef pair<int,int> PII;
const int N = 1e5+10, INF = 0x3f3f3f3f;
int n,a[N],ans; void solve(){cin>>n;map<int,int> mp;for(int i=1;i<=n;i++){cin>>a[i];mp[a[i]]++;}int sum1=0,sum2=0,ans=0;for(auto i:mp){if(i.se>2) sum1+=i.se-2; //多出的else if(i.se<2) sum2++; //单个的}if(sum1>=sum2) sum1-=sum2,ans+=sum2+sum1;else sum2-=sum1,ans+=sum1,ans+=sum2/2;cout<<ans;
}signed main(){int T=1;
//	IOS;
//	cin>>T;while(T--){solve();} return 0;
}

4 合并数列

思路:

  • 双指针,分别指向两个数组开头
  • 比较哪个大,小的那个就和后边的合并
  • 相等的话都同时右移

代码:

#include<bits/stdc++.h>
using namespace std;#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl '\n'
#define int long long
#define fi first
#define se second
typedef pair<int,int> PII;
const int N = 1e5+10, INF = 0x3f3f3f3f;
int n,m,a[N],b[N];void solve(){cin>>n>>m;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=m;i++) cin>>b[i];int cnt=0;int i=1,j=1,k1=1,k2=1;while(i<=n||j<=m){
//		cout<<i<<' '<<j<<' '<<a[i]<<' '<<b[j]<<endl;if(a[i]==b[j]){i+=k1; j+=k2;k1=1; k2=1;}else if(a[i]>b[j]){b[j]+=b[j+k2]; ++k2; ++cnt;}else{a[i]+=a[i+k1]; ++k1; ++cnt;}}cout<<cnt;
}signed main(){int T=1;
//	IOS;
//	cin>>T;while(T--){solve();} return 0;
}

5 数三角

思路:

  • 以每个点为顶点,找出到顶点距离相等的点的集合,然后遍历这些点,满足条件答案加1,当然这里的满足条件指的是三点不共线
  • 用斜率来判断三点是否共线

代码:

#include<bits/stdc++.h>
using namespace std;#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl '\n'
#define int long long
#define fi first
#define se second
typedef pair<int,int> PII;
const int N = 1e5+10, INF = 0x3f3f3f3f;
int n,ans;
vector<PII> arr;double get_dist(int x1,int y1,int x2,int y2){ //两点间距离 return pow(x1-x2,2)+pow(y1-y2,2);
}bool check(PII p1,PII p2,PII p3){if(p1.fi==p2.fi&&p1.fi==p3.fi) return true; //共线 double k1=(p1.se-p2.se)*1.0/(p1.fi-p2.fi);double k2=(p1.se-p3.se)*1.0/(p1.fi-p3.fi);return k1==k2; //斜率相等,共线 
}void solve(){cin>>n;for(int i=0;i<n;i++){int x,y; cin>>x>>y;arr.push_back({x,y}); //记录坐标 } for(int i=0;i<n;i++){map<int,vector<int>> mp; //存储到i号点距离相等的点的集合 for(int j=0;j<n;j++){if(i!=j){PII p1=arr[i],p2=arr[j];double d=get_dist(p1.fi,p1.se,p2.fi,p2.se);mp[d].push_back(j);}}for(auto t:mp){ //遍历所有的距离 vector<int> v=t.se; //到i号点距离相等的点 for(int j=0;j<v.size();j++){for(int k=j+1;k<v.size();k++){if(!check(arr[i],arr[v[j]],arr[v[k]])) ++ans;}}}}cout<<ans;
}signed main(){int T=1;
//	IOS;
//	cin>>T;while(T--){solve();} return 0;
}

7 AB路线

思路:

  • bfs,每个点可以走多次

代码:

#include<bits/stdc++.h>
using namespace std;#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl '\n'
#define int long long
#define fi first
#define se second
typedef pair<int,int> PII;
const int N = 1e3+10, INF = 0x3f3f3f3f;
int n,m,k,ans=-1;
char g[N][N];
bool st[N][N][11];
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
struct node{int x,y,num,step;
};void bfs(){queue<node> q;q.push({0,0,1,0});st[0][0][1]=1;while(q.size()){auto t=q.front(); q.pop();int x=t.x,y=t.y,num=t.num,step=t.step;if(x==n-1&&y==m-1){ans=step;break;}for(int i=0;i<4;i++){int tx=x+dx[i],ty=y+dy[i];if(tx<0||ty<0||tx>=n||ty>=m) continue;if(num==k){if(g[x][y]==g[tx][ty]||st[tx][ty][1]) continue;st[tx][ty][1]=1;q.push({tx,ty,1,step+1});}else if(g[tx][ty]==g[x][y]){if(st[tx][ty][num+1]) continue;st[tx][ty][num+1]=1;q.push({tx,ty,num+1,step+1});}}}}void solve(){cin>>n>>m>>k;for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>g[i][j];}}bfs();cout<<ans;
}signed main(){int T=1;
//	IOS;
//	cin>>T;while(T--){solve();} return 0;
}

8 抓娃娃

思路:

  • 判断线段是否被区间包含,只需要判断线段的中点是否在区间内,因为题目中已说线段的长度是小于等于区间长度的
  • 所以求出每个线段的终点,然后二分找到范围即可

代码:

#include<bits/stdc++.h>
using namespace std;#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl '\n'
#define int long long
#define fi first
#define se second
typedef pair<int,int> PII;
const int N = 1e5+10, INF = 0x3f3f3f3f;
int n,m;
int a[N][2],b[N];void solve(){cin>>n>>m;for(int i=1;i<=n;i++){int l,r; cin>>l>>r;l<<=1; r<<=1;a[i][0]=l,a[i][1]=r;b[i]=l+r>>1; //获取该线段中点 }sort(b+1,b+1+n);for(int i=1;i<=m;i++){int l,r; cin>>l>>r;l<<=1; r<<=1;int pos1=lower_bound(b+1,b+1+n,l)-b;int pos2=upper_bound(b+1,b+1+n,r)-b;cout<<pos2-pos1<<endl;} 
}signed main(){int T=1;
//	IOS;
//	cin>>T;while(T--){solve();} return 0;
}

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

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

相关文章

分层存储无法拯救 Kafka

01 引言 Apache Kafka 自诞生之日起&#xff0c;就以其卓越的设计和强大的功能&#xff0c;成为了流处理领域的标杆。它不仅定义了现代流处理架构&#xff0c;更以其独特的分布式日志抽象&#xff0c;为实时数据流的处理和分析提供了前所未有的能力。Kafka 的成功&#xff0…

Python小技巧:单下划线 ‘_‘

按照约定&#xff0c;单个独立下划线有时被用作变量名&#xff0c;这表示该变量是临时的、不重要或者只是一个辅助的存在。在编程中&#xff0c;这种命名方式有助于区分那些一次性使用的变量&#xff0c;避免它们与长期存在的变量混淆。同时&#xff0c;这也是遵循良好编程习惯…

nacos命名空间的配置

给微服务配置namespace 给微服务配置namespace只能通过修改配置来实现。 例如&#xff0c;修改order-service的application.yml文件&#xff1a; spring:cloud:nacos:server-addr: localhost:8848discovery:cluster-name: HZnamespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f…

NodeMCU ESP8266 获取I2C从机地址

文章目录 前言关于地址位读写位程序总结前言 I2C总线上可以挂载很多的从设备,每个设备都会有一个自己唯一的一个地址; 关于地址位 通常地址位占7位数据,主设备如果需要向从机发送/接收数据,首先要发送对应从机的地址,然后会匹配总线上挂载的从机的地址; 读写位 该位…

MySQL Join原理分析(缓冲块嵌套与索引嵌套循环)

场景假设 A表&#xff08;1000条数据&#xff09;left join B表&#xff08;1000条数据&#xff09;。 嵌套循环&#xff08;Nested-Loop Join&#xff09; 极简概括&#xff1a;顾名思义多层循环叠加&#xff0c;由于MySQL条数数量有限&#xff0c;所用for循环而不用while&…

windows编译opencv4.9

opencv很多人在windows上编译感觉特别麻烦&#xff0c;没有linux下方便&#xff0c;设定以下三点&#xff0c;我们几乎会无障碍。 1 安装cuda&#xff0c;cudnn 安装好cuda&#xff0c;cudnn&#xff0c;把cudnn的头文件&#xff0c;库等等拷贝到cuda的安装目录下面&#xff…

实现红黑树

目录 红黑树的概念 红黑树的节点结构定义 红黑树的插入 红黑树的验证 实现红黑树完整代码 红黑树的概念 红黑树 &#xff0c;是一种 二叉搜索树 &#xff0c;但 在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是 Red 或 Black 。 通过对 任何一条从根到叶子的…

1-2亿条数据需要缓存,如何合理设计存储

单机是不可能的&#xff0c;肯定是分布式存储 数据怎么落&#xff1f; 一般业界有三种解决方案 哈希取余分区 一致性哈希算法分区 哈希槽分区&#xff08;大厂专用&#xff0c;都在用&#xff09;最终的选择

git 命令之 - revert

简介 如果你想保留之前的推送记录&#xff0c;同时将回退的过程作为一个新的提交推送到远程仓库。 你可以使用 git revert 命令。 这个命令会创建一个新的提交&#xff0c;它是上一个提交的相反操作&#xff0c;从而撤销之前的更改&#xff0c;而不是重写项目的历史。 以下…

信息检索(37):Query-as-context Pre-training for Dense Passage Retrieval

Query-as-context Pre-training for Dense Passage Retrieval 标题摘要1 引言2 初步&#xff1a;上下文监督预训练2.1 coCondenser2.2 CoT-MAE 3 查询即上下文预训练3.1 预训练3.2 微调 4 实验4.1 预训练4.2 微调4.3 基线4.4 主要结果4.5 域外评估 5 分析5.1 生成的查询数量的影…

面向电商家居行业3D室内场景合成中的空间感知

本文主要介绍了3D场景合成技术在电商领域&#xff0c;尤其是家居家装行业的应用。它解释了如何使用3D场景合成创建逼真的室内设计&#xff0c;让消费者能够交互式地查看和体验产品&#xff0c;提高购物的趣味性和效率。文章提到了两种主要的3D室内场景生成算法&#xff1a;传统…

RN开发搬砖经验之—分析与定位图片文件被清空的原因

如题 最近工作上处理的一个BUG&#xff0c;先讲下结论/原因&#xff0c;然后再分享该主题相关的东西 结论是&#xff1a;copy图片文件时&#xff0c;源路径与目标路径相同—输入输出流同时操作同一个文件&#xff0c;导致文件清空了&#xff01; copy文件的主要源码如下&#…

OFDM802.11a的FPGA实现(十二)使用FFT IP核添加循环前缀

原文链接&#xff08;相关文章合集&#xff09;&#xff1a;OFDM 802.11a的xilinx FPGA实现 目录 1.前言2.循环前缀3.硬件实现4.ModelSim仿真 1.前言 为了能够消除传输过程当中的符号间干扰&#xff0c;在IFFT处理完毕之后还要加上循环前缀。 2.循环前缀 实际通信信道中,由于接…

【QEMU系统分析之实例篇(二十九)】

系列文章目录 第二十九章 QEMU系统仿真的机器创建分析实例 文章目录 系列文章目录第二十九章 QEMU系统仿真的机器创建分析实例 前言一、QEMU是什么&#xff1f;二、QEMU系统仿真的机器创建分析实例1.系统仿真的命令行参数2. 将当前机器配置导出到文件qmp_x_exit_preconfig()qe…

深度学习设计模式之单例模式

一、单例模式简介 一个类只能有一个实例&#xff0c;提供该实例的全局访问点&#xff1b; 二、单例模式实现步骤 使用一个私有构造函数、一个私有静态变量以及一个公有静态函数来实现。 私有构造函数保证了不能通过构造函数来创建对象实例&#xff0c;只能通过公有静态函数返…

【OpenGauss源码学习 —— (ALTER TABLE(ExecRewriteCStoreTable))】

ALTER TABLE&#xff08;ExecRewriteCStoreTable&#xff09; 概述ExecRewriteCStoreTable 函数ATCStoreRewriteTable 函数ATCStoreGetRewriteAttrs 函数ChangeTableSpaceForDeltaRelation 函数ATOnlyCheckCStoreTable 函数 声明&#xff1a;本文的部分内容参考了他人的文章。在…

JavaScript与Nest.js:打造高性能的服务器端应用

JavaScript与Nest.js&#xff1a;打造高性能的服务器端应用 在现代Web开发的广阔天地里&#xff0c;JavaScript已经不再局限于浏览器的疆域&#xff0c;而是凭借Node.js的强大力量&#xff0c;向服务器端领域大步迈进。Nest.js&#xff0c;一个基于Node.js的渐进式框架&#x…

【计算机网络】物理层 通信基础、奈氏准则、香农公式 习题2

下列说法中正确的是( )。 A. 信道与通信电路类似&#xff0c;一条可通信的电路往往包含一个信道 B.调制是指把模拟数据转换为数字信号的过程 C. 信息传输速率是指通信信道上每秒传输的码元数 D.在数值上&#xff0c;波特率等于比特率与每符号所含的比特数的比值 信息传输速率&a…

65-CPLD电路设计(安路为例)

视频链接 CPLD电路设计&#xff08;安路为例&#xff09;01_哔哩哔哩_bilibili CPLD电路设计&#xff08;以安路为例&#xff09; 浅谈板级电源设计的三种方法_哔哩哔哩_bilibili 参考【浅谈板级电源设计的三种方法】 FPGA板级硬件实战S1&#xff5e;7课 实战Power2-电…

一次基类类型对象无法被传递问题的分析

看下面一段代码&#xff1a; // proj2.cpp #include <iostream> using namespace std; class CharShape { public:CharShape(char ch) : _ch(ch) {};virtual void Show() 0; protected:char _ch; // 组成图形的字符 }; class Triangle : public CharShape { public:Tr…