蓝桥杯2024国赛--备赛刷题题单

1.游戏(单调队列)

注意如果结果是分数,直接设置变量为double,最好不要使用把int类型乘1.0变成分数来计算。

#include <iostream>
#include <queue>
using namespace std;
const int N=1e5+10;
//滑动窗口大小为k,最大值为P,最小值为Q,K=P-Q
//窗口个数为cnt=n-k+1
//所有情况为all=cnt*cnt
//期望值为(K1+K2+...+Kall)/all
//由于熊大选框和熊二选框的情况是一样的,因此只需要
//(K1+K2+...+Kcnt)/cnt
int a[N];
int wd[N];
deque<int>q;//双端队列
int main()
{int n,k;scanf("%d %d\n",&n,&k);for(int i=1;i<=n;i++){scanf("%d",&a[i]);}double sump=0;//窗口最大值加和for(int i=1;i<=n;i++){while(!q.empty()&&a[q.back()]<a[i])q.pop_back();q.push_back(i);//4 3 2 1...(从大到小的窗口)a[i]<=a[q.back()]才加入if(i>=k)//大于等于窗口大小才开始计算答案{ //不在窗口内的下标pop掉while(!q.empty()&&q.front()<=i-k)q.pop_front();sump+=a[q.front()];}}q.clear();//注意要把队列清空!double sumq=0;//窗口最小值加和for(int i=1;i<=n;i++){while(!q.empty()&&a[q.back()]>a[i])q.pop_back();q.push_back(i);//1 2 3 4...(从小到大的窗口)a[i]>=a[q.back()]才加入if(i>=k)//大于等于窗口大小才开始计算答案{ //不在窗口内的下标pop掉while(!q.empty()&&q.front()<=i-k)q.pop_front();sumq+=a[q.front()];}}printf("%.2lf\n",(sump-sumq)/(n-k+1));return 0;
}

2.01游戏(DFS剪枝)

#include<iostream>
using namespace std;
char a[15][15];
bool flag=0;
int n;
bool check()
{//判断行for(int i=0;i<n;i++){int cnt0=0,cnt1=0;//记录连续出现int sum0=0,sum1=0;for(int j=0;j<n;j++){if(a[i][j]=='_')cnt1=0,cnt0=0;//连续中断else if(a[i][j]=='1'){cnt1++;sum1++;cnt0=0;}else if(a[i][j]=='0'){cnt0++;sum0++;cnt1=0;}if(cnt1>2||cnt0>2)return 0;if(sum1>n/2||sum0>n/2) return false;//超过一半就无法保证数量相等}}//判断列for(int i=0;i<n;i++){int cnt0=0,cnt1=0;//记录连续出现int sum0=0,sum1=0;for(int j=0;j<n;j++){if(a[j][i]=='_')cnt1=0,cnt0=0;//连续中断else if(a[j][i]=='1'){cnt1++;sum1++;cnt0=0;}else if(a[j][i]=='0'){cnt0++;sum0++;cnt1=0;}if(cnt1>2||cnt0>2)return 0;if(sum1>n/2||sum0>n/2) return false;//超过一半就无法保证数量相等}}return 1;
}
void dfs(int x,int y)//默认是先向右走再向下走
{if(flag)return;if(y==n){x++;//再向下y=0;//再从左边起始开始}if(x==n){//到达右下角了可以输出答案flag=1;for(int i=0;i<n;i++){for(int j=0;j<n;j++){cout<<a[i][j];}cout<<endl;}return;}if(a[x][y]=='_'){a[x][y]='1';if(check())dfs(x,y+1);//合法才继续往下搜if(flag)return;a[x][y]='0';if(check())dfs(x,y+1);//合法才继续往下搜if(flag)return;a[x][y]='_';//复原}else dfs(x,y+1);
}
int main()
{cin>>n;for(int i=0;i<n;i++){for(int j=0;j<n;j++){cin>>a[i][j];}}dfs(0,0);return 0;
}

3.子2023(动态规划)

#include <iostream>
#include <string>
using namespace std;
long long dp[4];//注意开longlong!!
//dp[0]:以2结尾的序列数量
//dp[1]:以20结尾的序列数量
//dp[2]:以202结尾的序列数量
//dp[3]:以2023结尾的序列数量
int main()
{string s;for(int i=1;i<=2023;i++){string str=to_string(i);s+=str;}for(int i=0;i<s.size();i++){if(s[i]=='2'){dp[0]++;dp[2]=dp[2]+dp[1];}else if(s[i]=='0'){dp[1]=dp[1]+dp[0];}else if(s[i]=='3'){dp[3]=dp[3]+dp[2];}}cout<<dp[3];return 0;
}

4.双子数(质因数分解,线性筛)

#include <iostream>
#include <cmath>
using namespace std;
#define ll long long
const ll N=1e7+9;//N*N>23333333333333(2.3*10^13)
ll prime[N];
ll ans;
bool st[N];
//线性筛O(n)
ll getPrime()
{ll cnt=0;for(ll i=2;i<=N;i++){if(!st[i])prime[cnt++]=i;for(ll j=0;prime[j]*i<=N;j++){st[prime[j]*i]=1;if(i%prime[j]==0)break;}}return cnt;
}
int main()
{ll idx=getPrime();//预处理得到素数for(ll i=0;i<idx;i++)//遍历所有素数{ll p2=prime[i]*prime[i];//p^2if(p2*p2>23333333333333)break;for(ll j=i+1;j<idx;j++){ll q2=prime[j]*prime[j];//q^2if(p2*q2>23333333333333)break;if(p2*q2<2333)continue;ans++;//在区间内}}cout<<ans<<endl;return 0;
}

5.合并数列(双指针)

#include <iostream>
using namespace std;
const int N=1e5+10;
int a[N];
int b[N];
int n,m;
int ans;
int main()
{cin>>n>>m;for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i<=m;i++)cin>>b[i];int i=0,j=0;//从0开始//采用前缀和的思想int cnta=0,cntb=0;while(i<=n&&j<=m){if(cnta==cntb)//注意相等是等号!{cnta=a[++i];cntb=b[++j];}else if(cnta<cntb){cnta+=a[++i];ans++;}else if(cntb<cnta){cntb+=b[++j];ans++;}}cout<<ans<<endl;return 0;
}

6.数三角形(枚举,STL)

#include <iostream>
#include <vector>
#include <map>
#include <cmath>
using namespace std;
#define ll long long
#define pii pair<int,int>
int main()
{int n;cin>>n;vector<pii>a(n+2);map<pii,int>m;//表示坐标(x,y)点一共出现了几次for(int i=1;i<=n;i++){cin>>a[i].first>>a[i].second;m[{a[i].first,a[i].second}]++;}int ans=0;for(int i=1;i<=n;i++)//枚举每个点作为顶点{map<ll,vector<int>>st;//距离到达为ll时有多少个点for(int j=1;j<=n;j++){ll dist=(a[i].first-a[j].first)*(a[i].first-a[j].first)+(a[i].second-a[j].second)*(a[i].second-a[j].second);if(dist!=0)st[dist].push_back(j);//已经保证了i!=j}//计算合法数量for(auto &x:st)//st为map类型{vector<int>&v=x.second;int cnt=v.size();ans+=cnt*(cnt-1)/2;//两两组合可以作为答案//保证三点不共线int del=0;//不合法的点的数量for(int j=0;j<v.size();j++){int x1=a[i].first,y1=a[i].second;int x2=a[v[j]].first,y2=a[v[j]].second;int x3=2*x1-x2,y3=2*y1-y2;//三点共线,都在一个圆内//x1=(x3+x2)/2,y1=(y3+y2)/2del+=m[{x3,y3}];}ans-=(del/2);//三点共线 两点的情况多计算了一次}}cout<<ans<<endl;return 0;
}

7.AB路线(BFS)

#include <iostream>
#include <queue>
using namespace std;
#define ll long long
const int N=1000+500;
char a[N][N];
int n,m,k;
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
ll vis[N][N][11],dis[N][N][11];
//因为一个位置可以重复走多次,
//再加一维(到这个位置是第几个字母)
struct node
{int x,y,cnt;//cnt为当前为第cnt个相同字母node(int x=0,int y=0,int cnt=0):x(x),y(y),cnt(cnt){}
};
queue<node>q;//用于bfs
int main()
{cin>>n>>m>>k;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>a[i][j];}}q.push(node(1,1,1));//cnt=1,为第一个相同字母vis[1][1][1]=1;if(n==1&&m==1)//特判{cout<<0<<endl;return 0;} //开始BFSwhile(!q.empty()){node t=q.front();q.pop();for(int i=0;i<4;i++){int xx=t.x+dx[i];int yy=t.y+dy[i];int cc=t.cnt+1;if(xx<1||xx>n||yy<1||yy>m)continue;if(cc>k)//需要变{if(a[t.x][t.y]==a[xx][yy])continue;else cc=1;}else //不需要变{if(a[t.x][t.y]!=a[xx][yy])continue;}if(vis[xx][yy][cc]!=0)continue;vis[xx][yy][cc]++;dis[xx][yy][cc]=dis[t.x][t.y][t.cnt]+1;if(xx==n&&yy==m)//BFS先找到的一定是最小的,直接输出{cout<<dis[xx][yy][cc]<<endl;return 0;}q.push(node{xx,yy,cc});}}return 0;
}

8.跑步计划(日期问题)

#include <iostream>
#include <string>
using namespace std;
int main()
{int ans=0;int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};if((2023%400==0)||(2023%4==0&&2023%100!=0))a[2]++;int days=0;for(int i=1;i<=12;i++){for(int j=1;j<=a[i];j++){days++;string s1=to_string(i);string s2=to_string(j);   //2023年1月1日是周日if(s1.find('1')!=-1||s2.find('1')!=-1||days%7==2)ans+=5;else ans++;}}cout<<ans<<endl;return 0;
}

9.火车运输(动态规划背包问题)

#include <iostream>
using namespace std;
const int N=1000+10;
int dp[N][N];
int w[N];
int n,a,b;
int main()
{cin>>n>>a>>b;for(int i=1;i<=n;i++)cin>>w[i];// 三种情况:不选,放A,放Bfor(int i=1;i<=n;i++){for(int j=a;j>=0;j--){for(int k=b;k>=0;k--){if(j-w[i]>=0)dp[j][k]=max(dp[j][k],dp[j-w[i]][k]+w[i]);if(k-w[i]>=0)dp[j][k]=max(dp[j][k],dp[j][k-w[i]]+w[i]); }}}cout<<dp[a][b]<<endl;return 0;
}

10.走方格(动态规划图论)

#include <iostream>
using namespace std;
const int N=1000+100;
int a[N][N];
int dp[N][N];
int n;
int main()
{cin>>n;for(int i=0;i<n;i++){for(int j=0;j<n;j++){cin>>a[i][j];}}for(int i=0;i<n;i++){dp[i][0]=i;//表示走到此步需要的时间//因为连续的跳步只发生在水平方向}for(int i=0;i<n;i++){for(int j=1;j<n;j++){dp[i][j]=1e9;//初始为大值// 从上面下来if(i>0)dp[i][j]=min(dp[i][j],dp[i-1][j]+1);// 向左到达最远的地方(即最小的地方)// 因为是从上到下,从左到右枚举,所以是向左(因为左边已是更新好的值)int temp=j;//临时变量while(a[i][temp]<a[i][temp-1]&&temp>=1)//严格小于{dp[i][j]=min(dp[i][j],dp[i][temp-1]+1);temp--;}//从左边一个过来dp[i][j]=min(dp[i][j],dp[i][j-1]+1);}}cout<<dp[n-1][n-1]<<endl;return 0;
}

11.选段排序(堆,贪心)

#include<iostream>
#include<queue>
#include<vector>
#include<algorithm> 
using namespace std;
const int N=2e5+10;
int a[N];
priority_queue<int,vector<int>>q1;//大顶堆
priority_queue<int,vector<int>,greater<int>>q2;//小顶堆 
int main()
{int n,p,q;cin>>n>>p>>q;for(int i=1;i<=n;i++)cin>>a[i];sort(a+p,a+1+q);//注意sort的区间!!for(int i=p;i<=q;i++){//区间[p,q]先放入 q1.push(a[i]);//大 q2.push(a[i]);//小 } int ans=a[q]-a[p];//先得到初始的答案 //拓展右区间由[p,q]到[p,n]int maxx=a[q];int minn=a[p];for(int i=q+1;i<=n;i++){int t=q1.top();//先取堆顶 if(a[i]<minn)minn=a[i];//小的肯定可以排序到p if(a[i]<t)//t是拓展时用的 {q1.pop();//保证队列元素在[p,q]中q1.push(a[i]);ans=max(ans,q1.top()-minn);}	} //拓展左区间由[p,q]到[1,q],向左减法 for(int i=p-1;i>=1;i--){int t=q2.top();//先取堆顶 if(a[i]>maxx)maxx=a[i];//大的肯定可以排序到qif(a[i]>t){q2.pop();//保证队列元素在[p,q]中 q2.push(a[i]);ans=max(ans,maxx-q2.top());	} } cout<<ans<<endl;return 0;
}

12.混乘数字(数学,枚举)

#include <iostream>
#include <string>
#include <map>
#include <set>
using namespace std;
#define ll long long
set<ll>ans;//自动去重
bool check(ll n,ll a,ll b)
{int num[10]={0};string sn=to_string(n);string sa=to_string(a);string sb=to_string(b);for(int i=0;i<sn.size();i++){num[sn[i]-'0']++;}for(int i=0;i<sa.size();i++){num[sa[i]-'0']--;}for(int i=0;i<sb.size();i++){num[sb[i]-'0']--;}for(int i=0;i<=9;i++){if(num[i])return false;//通过相减}return true;
}
int main()
{for(ll i=1;i<=1000000;i++){ll kk=i*i;if(kk>1000000)break;if(check(kk,i,i))ans.insert(kk);for(ll j=i+1;j<=1000000;j++){kk=i*j;if(kk>1000000)break;if(check(kk,i,j))ans.insert(kk);}}cout<<ans.size()<<endl;return 0;
}

13.X质数(线性筛,二进制)

#include <iostream>
#include <string>
using namespace std;
const int N=1e6;
int idx=0;
int prime[N];
int st[N];
int ans=0;
void get()
{st[0]=st[1]=1;for(int i=2;i<=N;i++){if(!st[i])prime[++idx]=i;for(int j=1;j<=idx&&i*prime[j]<=N;j++)//从1开始{st[i*prime[j]]=1;if(i%prime[j]==0)break;}}
}
bool check(int x) {string num = to_string(x);int n = num.size();// n个数字,每个数字算不算进去两种选择for (int i = 0; i < (1 << n); ++i) { //n位数,有2^n种情况int cur = 0;for (int j = 0; j < n; ++j) { // 每种情况为一个二进制值if ((i >> j) & 1) cur = cur * 10 + num[j] - '0';}if (!st[cur]) return true;}return false;
}
int main()
{get();for(int i=1;i<=N;i++){if(check(i))ans++;}cout<<ans<<endl;return 0;
}

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

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

相关文章

Crosslink-NX器件应用连载(10): 图像输入并通过HDMI输出

作者&#xff1a;Hello,Panda 大家下午好&#xff0c;晚上好。这里分享一个Lattice Crosslink-NX器件通过MIPI或LVDS输入图像&#xff0c;并通过HDMI输出图像的案例&#xff08;其实这是个比较冷门的需求&#xff0c;Crosslink-NX器件还是主要做MIPI桥接用&#xff09;。 咱们…

2024Dragon Knight CTF复现web

穿梭隐藏的密钥 首先看看页面的源代码&#xff0c;但是发现f12和鼠标右键都被禁用了 用ctrlu查看&#xff0c;发现一个可疑页面 访问看看&#xff0c;发现还是只有一张图&#xff0c;查看源代码发现提示 扩展&#xff1a; Fuzz&#xff1a;Fuzz是一种基于黑盒的自动化软件模糊…

【强化学习】DPO(Direct Preference Optimization)算法学习笔记

【强化学习】DPO&#xff08;Direct Preference Optimization&#xff09;算法学习笔记 RLHF与DPO的关系KL散度Bradley-Terry模型DPO算法流程参考文献 RLHF与DPO的关系 DPO&#xff08;Direct Preference Optimization&#xff09;和RLHF&#xff08;Reinforcement Learning f…

根据状态转移图实现时序电路 (三段式状态机)

看图编程 * ** 代码 module seq_circuit(input C ,input clk ,input rst_n,output wire Y ); reg [1:0] current_stage ; reg [1:0] next_stage ; reg Y_reg; //输出//第一段 &#xff1a; 初始化当前状态和…

【再探】设计模式—访问者模式、策略模式及状态模式

访问者模式是用于访问复杂数据结构的元素&#xff0c;对不同的元素执行不同的操作。策略模式是对于具有多种实现的算法&#xff0c;在运行过程中可动态选择使用哪种具体的实现。状态模式是用于具有不同状态的对象&#xff0c;状态之间可以转换&#xff0c;且不同状态下对象的行…

【Gradle】Gradle的本地安装和使用

目录 1、Gradle 的安装 2、集成 IntelliJ IDEA 3、使用 Gradle Gradle 完全兼容 Maven 和 Ivy 仓库&#xff0c;你可以从中检索依赖也可以发布你的文件到仓库中&#xff0c;Gradle 提供转换器能把 Maven 的构建逻辑转换成 Gradle 的构建脚本。 1、Gradle 的安装 Gradle 的…

数据结构的快速排序(c语言版)

一.快速排序的概念 1.快排的基本概念 快速排序是一种常用的排序算法,它是基于分治策略的一种高效排序算法。它的基本思想如下: 从数列中挑出一个元素作为基准(pivot)。将所有小于基准值的元素放在基准前面,所有大于基准值的元素放在基准后面。这个过程称为分区(partition)操作…

微信小程序-页面导航

一、页面导航 页面导航指的是页面之间的相互跳转&#xff0c;例如&#xff1a;浏览器中实现页面导航的方式有如下两种&#xff1a; 1.<a>链接 2.location.href 二、小程序中实现页面导航的两种方式 1.声明式导航 在页面上声明一个<navigator>导航组件 通过点击…

AIGC微短剧轻量化制作

AIGC&#xff08;生成式AI&#xff09;和微短剧作为影视领域的发展趋势&#xff0c;热度持续不减。行业巨头纷纷涉足其中&#xff0c;头部公司也陆续宣布加入竞争。这一趋势带来了新一轮的资本狂欢。 事实上&#xff0c;无论是被视为未来发展的风向标&#xff0c;还是像只是一…

【核心动画-关键帧动画-CAKeyframeAnimation Objective-C语言】

一、接下来,我们来说这个关键帧动画, 1.我们把之前的基本动画,这一坨代码,备份到test1方法里边, 然后,开始说我们的关键帧动画,步骤都是一样的,都是三大步: // 关键帧动画 // 1.做什么动画 // 2.怎么做动画 // 3.对谁做动画 1)做什么动画 第一,我们现在要创建…

证件/文书类日期中文大写js/ts插件

说明 证件/文书类落款日期中文大写往往会将“零”写作“〇”&#xff0c;而数字依然使用简体“一二三”&#xff0c;而不是“壹贰叁”。 如下&#xff1a; 针对这一点&#xff0c;写了如下转换插件。 代码 function DateToUpperCase(date: Date new Date()) {const chStr …

【移动端】商场项目路由设计

1&#xff1a;路由设计配置&#xff1a; 一级路由配置 分析项目&#xff0c;设计路由&#xff0c;配置一级路由 一级路由&#xff1a;单个页面独立展示的&#xff0c;都是一级路由&#xff0c;例如&#xff1a;登录页面&#xff0c;首页架子&#xff0c;报错页面 二级路由&…

ADuM1201可使用π121U31间接替换π122U31直接替换

ADuM1201可使用π121U31间接替换π122U31直接替换 一般低速隔离通信150Kbps电路可使用π121U31&#xff0c;价格优势较大。速度快的有其它型号可达10M,200M,600M。 本文主要介绍ADUM1201,替换芯片π121U31简单资料请访问下行链接 只要0.74元的双通道数字隔离器&#xff0c;1T1…

【VSCode】快捷方式log去掉分号

文章目录 一、引入二、解决办法 一、引入 我们使用 log 快速生成的 console.log() 都是带分号的 但是我们的编程习惯都是不带分号&#xff0c;每次自动生成后还需要手动删掉分号&#xff0c;太麻烦了&#xff01; 那有没有办法能够生成的时候就不带分号呢&#xff1f;自然是有…

ubuntu 18.04 ros1学习

总结了一下&#xff0c;学习内容主要有&#xff1a; 1.ubuntu的基础命令 pwd: 获得当前路径 cd: 进入或者退出一个目录 ls:列举该文件夹下的所有文件名称 mv 移动一个文件到另一个目录中 cp 拷贝一个文件到另一个目录中 rm -r 删除文件 gedit sudo 给予管理员权限 sudo apt-…

开源硬件初识——Orange Pi AIpro(8T)

开源硬件初识——Orange Pi AIpro&#xff08;8T&#xff09; 大抵是因为缘&#xff0c;妙不可言地就有了这么一块儿新一代AI开发板&#xff0c;乐于接触新鲜玩意儿的小火苗噌一下就燃了起来。 还没等拿到硬件&#xff0c;就已经开始在Orange Pi AIpro 官网上查阅起资料&…

基于安卓的虫害识别软件设计--(1)模型训练与可视化

引言 简介&#xff1a;使用pytorch框架&#xff0c;从模型训练、模型部署完整地实现了一个基础的图像识别项目计算资源&#xff1a;使用的是Kaggle&#xff08;每周免费30h的GPU&#xff09; 1.创建名为“utils_1”的模块 模块中包含&#xff1a;训练和验证的加载器函数、训练…

如何使用Spring Cache优化后端接口?

Spring Cache是Spring框架提供的一种缓存抽象,它可以很方便地集成到应用程序中,用于提高接口的性能和响应速度。使用Spring Cache可以避免重复执行耗时的方法,并且还可以提供一个统一的缓存管理机制,简化缓存的配置和管理。 本文将详细介绍如何使用Spring Cache来优化接口,…

【前端】Mac安装node14教程

在macOS上安装Node.js版本14.x的步骤如下&#xff1a; 打开终端。 使用Node Version Manager (nvm)安装Node.js。如果你还没有安装nvm&#xff0c;可以使用以下命令安装&#xff1a; curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash 然后关…

基于NANO 9K 开发板加载PICORV32软核,并建立交叉编译环境

目录 0. 环境准备 1. 安装交叉编译器 2. 理解makefile工作机理 3. 熟悉示例程序的代码结构&#xff0c;理解软核代码的底层驱动原理 4. 熟悉烧录环节的工作机理&#xff0c; 建立下载环境 5. 编写例子blink&#xff0c; printf等&#xff0c; 加载运行 6. 后续任务 0.…