第十五届蓝桥杯省赛大学B组(c++)

很幸运拿了辽宁赛区的省一,进入6月1号的国赛啦...

这篇文章主要对第十五届省赛大学B组(C++)进行一次完整的复盘,这次省赛==2道填空题+6道编程题:

A.握手问题

把握手情景看成矩阵:

粉色部分是7个不能互相捂手的情况

由于每个人只能和其他人捂手, 所以黑色情况是不算的

1和2握手==2和1握手,就是只用算一半的对角矩阵

#include<iostream>
using namespace std;
int main(){int a=0;for(int i=49;i;i--) a+=i;int b=0;for(int i=6;i;i--) b+=i;int ans=a-b;cout<<ans<<endl;//最后求得答案为1204 return 0;
}

B.小球反弹

这题考试的时候我是直接跳过的,到最后也没来得及看,看了估计也算不对,haha

整体思路是:

最终返回左上角时,小球走过的水平路程和垂直路程一定是343720和233333的偶数倍

并且水平路程与垂直路程之比一定为15:17

#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
const int N=1e4;
const ll X=343720;
const ll Y=233333;
int main(){for(ll x=2;x<=N;x+=2){for(ll y=2;y<=N;y+=2){if (15*Y*y==17*X*x){printf("%lf",sqrt((X*x)*(X*x)+(Y*y)*(Y*y)));//结果是1100325199.770395return 0;}}}
}

C.好数

这题暴力枚举就能AC,数据不大,haha

#include<iostream>
using namespace std;
typedef long long ll;
const int N=1e7+5;
ll ans;
bool check(int x){int flag=0;while(x>0){int t=x%10;if(!flag){if(t%2==0) return false;else flag=1;}else{if(t%2!=0) return false;else flag=0;}x/=10;}return true;
}
int main(){int n;cin>>n;for(int i=1;i<=n;i++) if(check(i)) ans++;cout<<ans<<endl;return 0;
}

D.R格式

考试时候的代码:

#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
int main(){int n;double d;cin>>n>>d;ll a=(ll)pow(2,n);double ans=a*d;double res=(ll)ans+0.5;if(ans>=res) cout<<(ll)ans+1<<endl;else cout<<(ll)ans<<endl;return 0;
}

混了一半的分数:

高精度优化(AC): 

#include<iostream>
#include<algorithm>//reverse函数:前后翻转
#include<cstring>//to_string函数:数字常量转化为字符串
using namespace std;
typedef long long ll;
int n;string d;
string ans="1";
string add(string a,string b){string res;int la=a.size(),lb=b.size();int i=la-1,j=lb-1,jw=0;while(i>=0||j>=0){int sum=jw;if(i>=0) sum+=a[i--]-'0';if(j>=0) sum+=b[j--]-'0';jw=sum/10;res+=to_string(sum%10);}if(jw) res+=to_string(jw);reverse(res.begin(),res.end());return res;
}
string mul(string a,string b){string res="0";int la=a.size(),lb=b.size();for(int i=la-1;i>=0;i--){int jw=0;string temp;for(int j=lb-1;j>=0;j--){int sum=(a[i]-'0')*(b[j]-'0')+jw;jw=sum/10;temp+=to_string(sum%10);}if(jw) temp+=to_string(jw);reverse(temp.begin(),temp.end());for(int k=0;k<la-1-i;k++) temp+="0";res=add(res,temp);}return res;
}
int main(){cin>>n>>d;while(n--) ans=mul(ans,"2");string newd="";int flag;for(int i=0;i<d.size();i++){if(d[i]!='.') newd+=d[i];else flag=d.size()-i-1;}ans=mul(newd,ans);int key=ans.size()-flag;string s="";for(int i=0;i<key;i++) s+=ans[i];if(ans[key]>='5') s=add(s,"1");cout<<s;return 0;
}

E.宝石组合

整体思路(当然考试时候我肯定是没想出来):

由最小公倍数和最大公约数的性质
我们可以推出S的值就等于三个数的最大公约数gcd(h[a],h[b],h[c])
当三个数的最大公约数最大时,s最大,然后把包含此因子的三个最小数输出即可
//最大公约数
int gcd(int a,int b){return b==0?a:gcd(b,a%b);
}
//最小公倍数
int lcm(int a,int b){return a*b/gcd(a,b);
}

暴力:

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int n,h[N],ans[5],res[5],temp=0;
int gcd(int a,int b){return b==0?a:gcd(b,a%b);
}
int gcd3(int a,int b,int c){return gcd(gcd(a,b),c);
}
void dfs(int x,int startt) {if(x>3){int y=gcd3(h[ans[1]],h[ans[2]],h[ans[3]]);if(y>temp){res[1]=ans[1],res[2]=ans[2],res[3]=ans[3];temp=y;}return ;}for(int i=startt;i<=n;i++){ans[x]=i;dfs(x+1,i+1);ans[x]=0;}
}
int main(){cin>>n;for(int i=1;i<=n;i++) cin>>h[i];dfs(1,1);h[1]=h[res[1]],h[2]=h[res[2]],h[3]=h[res[3]];sort(h+1,h+4);cout<<h[1]<<" "<<h[2]<<" "<<h[3]<<endl;return 0;
}

优化思路(AC):

#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
const int N=1e5+5;
int n,h[N];
vector<int>ans[N];
int main(){cin>>n;for(int i=0;i<n;i++) cin>>h[i];sort(h,h+n);//遍历一遍把数放入其因子中for(int i=0;i<n;i++){for(int j=1;j<=sqrt(h[i]);j++){if(h[i]%j==0){ans[j].push_back(h[i]);if(h[i]/j!=j) ans[h[i]/j].push_back(h[i]);}}}//从最大的因子开始遍历,个数不低于3就可以输出for(int i=N-1;i>=0;i--){if(ans[i].size()>=3){cout<<ans[i][0];for(int j=1;j<3;j++){cout<<" "<<ans[i][j];}break;}}return 0;
}

F.数字接龙

这题考试时候没想明白如何判断路径是否交叉,就只会dfs出所有答案可能的情况,折腾将近一个小时还没解决,最后无奈提交了样例还有-1这个情况...

实际上对于斜方向进行判断时,只需判断对于斜边的两个坐标是否被选中(AC):

#include<iostream>
#include<string>
using namespace std;
int n,k,a[15][15],endd=0;
bool flag[15][15];
int dx[8]={-1,-1,0,1,1,1,0,-1};
int dy[8]={0,1,1,1,0,-1,-1,-1};
string ans;
//寻找方向函数
int direction(int x,int y){if(a[x][y]==k-1) return 0;else return a[x][y]+1;
}
//回溯字符串函数
string delete_last(string s){if(s.size()==1) return "";//注意:大小为1时返回空string temp="";for(int i=0;i<=s.size()-2;i++) temp+=s[i];return temp;
}
//核心函数dfs
void dfs(int x,int y){flag[x][y]=true;if(x==n&&y==n&&ans.size()==n*n-1){cout<<ans<<endl;//只要找到字典序最小的,找到后标记enddendd++;return ;}int dir=direction(x,y);for(int i=0;i<=7;i++){int xx=x+dx[i],yy=y+dy[i];if(xx>=1&&xx<=n&&yy>=1&&yy<=n&&a[xx][yy]==dir&&flag[xx][yy]==false){//判断斜方向情况,i才是真正的方向,direction只是方向的值if(i==1&&flag[x-1][y]&&flag[x][y+1]) continue;else if(i==3&&flag[x][y+1]&&flag[x+1][y]) continue;else if(i==5&&flag[x+1][y]&&flag[x][y-1]) continue;else if(i==7&&flag[x-1][y]&&flag[x][y-1]) continue;else{flag[xx][yy]=true;ans+=to_string(i);dfs(xx,yy);//在回溯时,特判一下已经找到答案的情况if(endd) return ;//回溯flag[xx][yy]=false;ans=delete_last(ans);}}}return ;
}
int main(){cin>>n>>k;//注意:k的值不可能大于pow(n,2)if(k>n*n){puts("-1");return 0;}for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>a[i][j];dfs(1,1);//利用endd标记是否成功dfsif(!endd) puts("-1");return 0;
}

G.爬山

这题利用STL的优先队列进行模拟,考试时候魔法一和魔法二相同时候的情况没完善明确,因此下面这段代码肯定会有问题,但考完试我隐约记得while(m--)好像被我写成了while(n--),我真是个**:

#include<iostream>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int n,p,q,h[N];
ll ans;
priority_queue<int,vector<int>,less<int>>pq;
int magic(int x){int a=sqrt(x);int b=x/2;if(a>b) return 2;else if(a<b) return 1;else return 0;
}
int main(){cin>>n>>p>>q;for(int i=1;i<=n;i++){int x;cin>>x;pq.push(x);}int m=p+q;while(m--){int t=pq.top();pq.pop();if(p>0&&q>0){int tt=magic(t);if(tt==0){if(q>p) pq.push(t/2),q--;else pq.push((int)sqrt(t)),p--;}else if(tt==1){pq.push((int)sqrt(t));p--;}else{pq.push(t/2);q--;}}else if(p>0&&q<=0){pq.push((int)sqrt(t)),p--;}else if(q>0&&p<=0){pq.push(t/2),q--;}else{break;}}while(pq.size()){ans+=pq.top();pq.pop();}cout<<ans<<endl;return 0;
}

HACK数据:

2 1 1
49 48

H.拔河

这题考试时候直接理解错题目了(哭),以为每一人都要参加拔河,估计直接零蛋了haha

所以做题时一定要认真把题目读清楚...

暴力枚举两个连续区间的左右端点:

#include<iostream>
using namespace std;
typedef long long ll;
const int N=1e3+5;
ll n,a[N],l1,r1,l2,r2,ans=1e18;//不开浪浪见祖宗...
int main(){cin>>n;for(int i=1;i<=n;i++){//前缀和cin>>a[i];a[i]+=a[i-1];}for(int l1=1;l1<=n;l1++){for(int r1=1;r1<=n;r1++){for(int l2=1;l2<=n;l2++){for(int r2=1;r2<=n;r2++){if(l1<=r1&&r1<l2&&l2<=r2){ll sum1=a[r1]-a[l1-1];ll sum2=a[r2]-a[l2-1];ans=min(ans,abs(sum2-sum1));}}}}}cout<<ans<<endl;return 0;
}

前缀和+multiset(AC): 

#include<iostream>
#include<set>
using namespace std;
typedef long long ll;
const int N=1e3+5;
ll n,a[N],ans=1e18;
multiset<ll>s;
int main(){cin>>n;for(int i=1;i<=n;i++){cin>>a[i];a[i]+=a[i-1];}//利用multiset(有序并且可以重复)记录所有可能的区间for(int l=1;l<=n;l++) for(int r=1;r<=n;r++) if(r>=l) s.insert(a[r]-a[l-1]);//枚举左区域的右端点for(int r=1;r<n;r++){//删除以r为左端点的所有区间,因为接下来右区间是从r+1开始选择//如果保留之前的以r为左端点的右区间之和,会影响答案for(int i=r;i<=n;i++) s.erase(s.find(a[i]-a[r-1]));//枚举左区间的左端点for(int l=1;l<=r;l++){//计算左区间ll temp=a[r]-a[l-1];auto x=s.lower_bound(temp);//multiset.lower_bound(key)函数返回一个迭代器//返回第一个>=key的元素//如果key>容器max,则返回当前容器中最后一个元素的位置if(x!=s.end()){ans=min(ans,abs(*x-temp));//和temp右侧的*x更新ans}if(x!=s.begin()){x--;//先向左移动xans=min(ans,abs(*x-temp));//和temp左侧的*x更新ans}}}cout<<ans<<endl;return 0;
}

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

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

相关文章

Vue+OpenLayers7入门到实战:OpenLayers解析通过fetch请求的GeoJson格式数据,并叠加要素文字标注,以行政区划边界为例

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7入门到实战 前言 本章介绍如何使用OpenLayers7在地图上通过fetch请求geojson数据,然后通过OpenLayers解析为Feature要素叠加到图层上,并且通过动态设置标注方式显示要素属性为文字标注。 本章还是以行政区划边界为例,这个…

大模型LLM之SFT微调总结

一. SFT微调是什么 在大模型的加持下现有的语义理解系统的效果有一个质的飞跃&#xff1b;相对于之前的有监督的Pre-Train模型&#xff1b;大模型在某些特定的任务中碾压式的超过传统nlp效果&#xff1b;由于常见的大模型参数量巨大&#xff1b;在实际工作中很难直接对大模型训…

游戏陪玩平台app小程序H5源码交付游戏陪玩接单软件游戏陪玩源码 陪玩小程序陪玩工作室运营模式陪玩管理系统游戏陪玩工作室怎么做

提供陪玩平台源码&#xff0c;陪玩系统源码&#xff0c;陪玩app源码&#xff0c;团队各部门配备齐全&#xff0c;分工明确&#xff0c;及时对接开发进度&#xff0c;保证开发效率 一、陪玩平台源码的功能介绍 1、派单大厅:陪玩系统源码的派单大厅内支持用户通过语音连麦的方式…

Vue.js-----vue组件

能够说出vue生命周期能够掌握axios的使用能够了解$refs, $nextTick作用能够完成购物车案例 Vue 生命周期讲解 1.钩子函数 目标&#xff1a;Vue 框架内置函数&#xff0c;随着组件的生命周期阶段&#xff0c;自动执行 作用: 特定的时间点&#xff0c;执行特定的操作场景: 组…

硬性清空缓存的方法

前端发布代码后&#xff0c;我们是需要刷新页面再验证的。有时候仅仅f5 或者ctrlshiftdelete快捷键仍然有历史缓存&#xff0c;这时可以通过下面的方法硬性清空缓存。 以谷歌浏览器为例&#xff0c;打开f12&#xff0c;右键点击刷新按钮&#xff0c;选择【清空缓存并硬性加载】…

Windows只能安装在GPT磁盘上

转换磁盘分区形式 步骤1. 先按照正常流程使用Windows系统安装光盘或系统U盘引导计算机。 步骤2. 在Windows安装程序中点击“开始安装”&#xff0c;然后按ShiftF10打开命令提示符。 步骤3. 依次输入以下命令&#xff0c;并在每一行命令后按一次Enter键执行。 步骤4. 等待转换…

C++ | Leetcode C++题解之第78题子集

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> t;vector<vector<int>> ans;void dfs(int cur, vector<int>& nums) {if (cur nums.size()) {ans.push_back(t);return;}t.push_back(nums[cur]);dfs(cur 1, nums);t.po…

自动驾驶学习2-毫米波雷达

1、简介 1.1 频段 毫米波波长短、频段宽,比较容易实现窄波束,雷达分辨率高,不易受干扰。波长介于1~10mm的电磁波,频率大致范围是30GHz~300GHz 毫米波雷达是测量被测物体相对距离、相对速度、方位的高精度传感器。 车载毫米波雷达主要有24GHz、60GHz、77GHz、79GHz四个频段。 …

深度学习基础之《TensorFlow框架(17)—卷积神经网络》

一、卷积神经网络介绍 1、背景 随着人工智能需求的提升&#xff0c;我们想要做复杂的图像识别&#xff0c;做自然语言处理&#xff0c;做语义分析翻译等等&#xff0c;多层神经网络的简单叠加显然力不从心 2、卷积神经网络与传统多层神经网络对比 &#xff08;1&#xff09;传…

实战 | 18行代码轻松实现人脸实时检测【附完整代码与源码详解】Opencv、人脸检测

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

【图像识别】Swin Transformer

一、引言 论文&#xff1a; Swin Transformer: Hierarchical Vision Transformer using Shifted Windows 作者&#xff1a; Microsoft Research Asia 代码&#xff1a; Swin Transformer 特点&#xff1a; 提出滑动窗口自注意力 (Shifted Window based Self-Attention) 解决Vi…

【3D基础】坐标转换——地理坐标投影到平面

汤国安版GIS原理第二章重点 1.常见投影方式 https://download.csdn.net/blog/column/9283203/83387473 Web Mercator投影&#xff08;Web Mercator Projection&#xff09;&#xff1a; 优点&#xff1a; 在 Web 地图中广泛使用&#xff0c;易于显示并与在线地图服务集成。在…

java.net.SocketInputStream.socketRead0 卡死导致 tomcat 线程池打满的问题

0 TL;DR; 问题与原因&#xff1a;某些特定条件下 java.net.SocketInputStream.socketRead0 方法会卡死&#xff0c;导致运行线程一直被占用导致泄露采用的方案&#xff1a;使用监控线程异步监控卡死事件&#xff0c;如果发生直接关闭网络连接释放链接以及对应的线程 1. 问题 …

Burp Suite 抓包,浏览器提示有软件正在阻止Firefox安全地连接到此网站

问题现象 有软件正在阻止Firefox安全地连接到此网站 解决办法 没有安装证书&#xff0c;在浏览器里面安装bp的证书就可以了 参考&#xff1a;教程合集 《H01-启动和激活Burp.docx》——第5步

WhisperCLI-本地部署语音识别系统;Mis开源LLM推理平台;Dokploy-开源版Vercel;Mem-大规模知识图谱

1. Whisper-cli&#xff1a;可本地部署的开源语音识别系统 近日&#xff0c;Ruff的开发团队发布了一款名为Whisper cpp cli的全新语音识别系统&#xff0c;该系统已在GitHub Repo上开源。这是一款完全自主研发的语音转文字系统&#xff0c;基于Whisper技术构建。Ruff团队一直以…

Istio基础知识

一、什么是Istio Istio 提供⼀种简单的⽅式来为已部署的服务建⽴⽹络&#xff0c;该⽹络具有 负载均衡、服务间认证、监控等功能&#xff0c;只需要对服务的代码进⾏⼀点或不需要做任何改动。想要让服务⽀持 Istio&#xff0c;只需要在您的环境中部署⼀个特殊的 sidecar 代 理&…

netsh命令

netsh是本地或远程计算机Windows 2000网络组件的命令行和脚本实用程序。为了存档或配置其他服务器&#xff0c;netsh实用程序也可将配置脚本保存在文本文件中。netsh实用程序是一个外壳&#xff0c;通过附加的“netsh帮助DLL”可支持多个Windows 2000组件。 有两种方式可以运行…

从 Servlet 到 DispatcherServlet(SpringMvc 容器的创建)

DispatcherServlet 的继承体系 SpringMvc 是一个具有 Spring 容器&#xff08;ApplicationContext&#xff09;的 Servlet。其中&#xff0c;HttpServlet 属于 JDK 的内容&#xff0c;从 HttpServletBean 开始&#xff0c;便属于 Spring 体系中的内容。 HttpServletBean&…

unity制作app(5)--发送数据给数据库

这个之前做过&#xff0c;先不做照片的。下一节再做带照片的。 第一步 收集数据 1.先做一个AppModel结构体&#xff0c;这个结构体需要单做的。 using System; using System.Collections.Generic; using System.Linq; using System.Text; //using Assets.Model; public clas…

Unity 性能优化之GPU Instancing(五)

提示&#xff1a;仅供参考&#xff0c;有误之处&#xff0c;麻烦大佬指出&#xff0c;不胜感激&#xff01; 文章目录 前言一、GPU Instancing使用方法二、使用GPU Instancing的条件三、GPU Instancing弊端四、注意五、检查是否成功总结 前言 GPU Instancing也是一种Draw call…