第十五届蓝桥杯省赛大学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;
}
相关文章:

第十五届蓝桥杯省赛大学B组(c++)
很幸运拿了辽宁赛区的省一,进入6月1号的国赛啦... 这篇文章主要对第十五届省赛大学B组(C)进行一次完整的复盘,这次省赛2道填空题6道编程题: A.握手问题 把握手情景看成矩阵: 粉色部分是7个不能互相捂手的情况 由于每个人只能和其他人捂手, 所以黑色情况是不算的 1和2握手2和…...

Python Flask框架(一)初识Flask
Flask是使用Python编写的Web微框架。Web框架可以使我们不用关心底层的请求响应处理,更方便高效的编写Web程序。Flask有两个主要依赖,一个是WSGI(Web Server Gateway Interface,web服务器网关接口)工具集,另…...

VS2022 .Net6.0 无法打开窗体设计器
拿Vs2022 建了个Demo,运行环境是net6.0-windows,无论双击或是右键都打不开窗体设计器 打开项目目录下的*.csproj.user <?xml version"1.0" encoding"utf-8"?> <Project ToolsVersion"Current" xmlns"htt…...

Linux学习之高级IO
之前的内容我们基本掌握了基础IO,如套接字,文件描述符,重定向,缓冲区等知识都是文的基本认识,而高级IO则是指更加高效的IO。 对于应用层,在读写的时候,本质就是把数据写给OS,若一方…...

一分钟了解Polysciences PEI 40K转染试剂的原理
在细胞实验中,细胞转染大概是最常用、最基础的实验技能。转染细胞的方法很多,而PEI作为带有高电荷阳离子的多聚物,非常容易结合带负电荷的DNA分子,形成复合物,在HEK293和CHO等细胞中转染效率较高,常用于大规…...

Clickhouse IP 函数
IPv4NumToString(num) 将数字类型ip转换为IPv4格式。 Takes a UInt32 number. Interprets it as an IPv4 address in big endian. Returns a string containing the corresponding IPv4 address in the format A.B.C.d (dot-separated numbers in decimal form). Alias: …...

【Python】numpy.ptp()
numpy.ptp() 函数是 NumPy 库中的一个有用函数,用于计算数组中的“峰到峰”(peak-to-peak)值,即数组中的最大值与最小值之差。这个函数可以帮助快速评估数组中数据的变化范围,常用于信号处理、数据分析等领域中&#x…...

The provided password or token is incorrect or your account
IDEA使用git技巧 【/n】 01 问题出现场景 我的gitlab上个月生成的token到期了,于是今天推上去的时候报了这个错误 The provided password or token is incorrect or your account has 2FA enabled and you must use a personal access token instead of a password. See ht…...

常见的shell命令
以下是一些常见的shell命令: cd:改变当前目录;ls:列出目录中的文件和子目录;mkdir:创建一个新的目录;touch:创建一个新的空文件或更新已存在的文件的时间戳;rmÿ…...

堆栈打印跟踪Activity的启动过程(基于Android10.0.0-r41),framework修改,去除第三方app的倒计时页面
文章目录 堆栈打印跟踪Activity的启动过程(基于Android10.0.0-r41),framework修改,去除第三方app的倒计时页面1.打印异常堆栈2.去除第三方app的倒计时页面3.模拟点击事件跳过首页进入主页 堆栈打印跟踪Activity的启动过程(基于Android10.0.0-r41)&#x…...

只允许内网访问时,如何设置hosts
1、Hosts文件简介 hosts文件是一个没有扩展名的计算机文件,用于将主机名与对应的 IP 地址关联起来。在操作系统中,hosts文件通常用于在本地解析域名,以便将域名映射到特定的IP地址。这个文件可以用来屏蔽广告、加速访问特定网站、解决DNS解析…...

nature《自然》期刊文献怎么在家查看下载
nature《自然》期刊我们都知道,是世界上历史悠久的、最有名望的科学杂志之一。下载该期刊文献是需要使用权限的,如果你没有nature《自然》期刊的资源,又该如何获取呢?请看本文的经验分享。 一、先百度“文献党下载器” 在文献党下…...

python作业五
题目:注册登录 制作一个注册登录模块 注册:将用户填入的账户和密码保存到一个文件(users.bin) 登陆:将用户填入账户密码和users.bin中保存的账户密码进行比对,如果账户和密码完全相同 那 么登录成功,否则登录失败…...

经典的设计模式和Python示例(一)
目录 一、工厂模式(Factory Pattern) 二、单例模式(Singleton Pattern) 三、观察者模式(Observer Pattern) 一、工厂模式(Factory Pattern) 工厂模式(Factory Pattern…...

Ubuntu服务器如何安装桌面
更新软件库 apt-get update 升级软件 apt-get upgrade 安装ubuntu桌面系统 apt-get install ubuntu-desktop 运行过程需要手动确认两次,选择 Y。 安装完成之后,终端输入 reboot,重启服务器。...

填报表如何实现电话号码的校验
单元格校验时,只能输入数字和特定字符(-),即实现固话和手机号码的校验,保证录入的规范,应如何实现? 解决方案:使用正则表达式实现校验效果,如下图所示: 校验…...

揭秘全网热门话题:抖音快速涨粉方法,巨量千川投流助你日增10000粉
在当今社交媒体的时代( 千川投流:hzzxar)抖音成为了年轻人分享自己才华和生活的平台。然而,要在抖音上快速获得关注和粉丝,却不是一件容易的事情。今天,我们将揭秘全网都在搜索的抖音快速涨1000粉的秘籍,带…...

电脑提示‘找不到msvcr110dll,无法继续执行代码’的解决方法,3分钟快速修复
不知道大家有没有遇到过这种情况,无端端电脑提示你找不到msvcr110dll,无法继续执行代码?当出现这个情况,证明你的某个程序就已经运行不了,你需要去修复这个错误,才能正常的运行程序,下面我们一起来详细的了…...

如何在Hostease的Linux虚拟主机上永久移除WordPress网站
最近有遇到客户咨询如何移除Linux虚拟主机上的WordPress网站的, 因为原先的站点长时间不更新,被恶意篡改,跳转到了一个博彩网站上,本身网站也比较旧了,客户也不准备修复,准备重新建站。但是又怕移除不干净&…...

【云原生】Docker 的网络通信
Docker 的网络通信 1.Docker 容器网络通信的基本原理1.1 查看 Docker 容器网络1.2 宿主机与 Docker 容器建立网络通信的过程 2.使用命令查看 Docker 的网络配置信息3.Docker 的 4 种网络通信模式3.1 bridge 模式3.2 host 模式3.3 container 模式3.4 none 模式 4.容器间的通信4.…...

如何优雅的实现浏览器多标签通讯
前言 开发过程中无法避免遇到需要进行多标签通讯的情况,例如: 管理员登陆后,其他打开标签的页面登陆状态要变更课堂页面只能打开一个,另一个则通知失效等等。。。场景 然而实现该功能,我们需要使用页面能共同持有的…...

刷题之不相同的字符串(卡码网模拟)
卡码网不同的字符串 #include<vector> #include<string> #include<iostream> using namespace std; int main() {int n0;cin>>n;for(int i0;i<n;i){string s;cin>>s;vector<int>hash(26,0);for(int j 0;j < s.size();j)hash[s[j…...

JS-导入导出
export和export default是ES6中导出模块中变量的语法 导入导出变量 //导出方法(js文件中) export const 变量名值//导入方法 对应导入的变量,一定要加花括号 import {变量名} from js文件路径 导入导出函数 //导出方法(js文件中…...

【代码随想录——数组篇】
代码随想录——数组篇 2. 二分查找3. 移除元素4. 有序数组的平方5. 长度最小的子数组6. 螺旋矩阵II 2. 二分查找 力扣题目链接 前提: 有序数组数组中无重复元素 代码: (版本一)左闭右闭区间 class Solution {public int sea…...

使用 js 类封装项目中音频播放功能的工具方法utils
在前端开发中,音频播放功能是一个常见的需求,我们经常需要在项目中加入音频播放、音频提示等功能。为了提高开发效率和代码复用性,我们可以封装一个工具方法来管理音频播放功能。 在本文中,我将介绍如何封装项目中音频播放功能的…...

【超详细】R语言贝叶斯方法在生态环境领域中的高阶技术应用
查看原文>>>R语言贝叶斯方法在生态环境领域中的高阶技术应用 目录 专题一:前期资料 专题二:R和Rstudio入门和绘图(含ggplot) 专题三:R语言数据清洗-tidyverse包应用 专题四:贝叶斯回归模型-回…...

Python 正则表达式 re . 符号
Python 正则表达式 re . 符号 正文示例1示例2 正文 用法说明:(点号) 在默认模式下,匹配除换行符以外的任意字符。 如果指定了 flags 参数 DOTALL ,它将匹配包括换行符在内的任意字符。 示例1 import restr1 abcde print(re.search(., str…...

智慧监控 高效运维
随着企业IT建设的不断深入和完善,IT管理的重要性逐渐被重视,打通数据割裂,使业务更加充分融合。亟需一套统一的平台来实现跨品牌跨设备类型的集中监控和管理。 LinkSLA带外监控平台,不仅适用于大规模或超大规模的运维场景&#x…...

JAVA每日面试题(一)
Java面试问题及答案 1. 解释Java中的垃圾回收机制和如何优化它 问题: 在Java中,垃圾回收(Garbage Collection, GC)是如何工作的?作为一名Java开发者,你如何优化垃圾回收以提高应用性能? 答案…...

Java数组创建与使用
一.创建和初始化 1.数组是怎么创建的? 直接举例子: int[] arr new int[10]; 这里只简单的举一个int开辟数组的例子。 可见java数组的创建于C语言是不同的。前面是一个int[ ]就是一个数组的数据类型,后面的arr是数组名,最后[…...