文章目录
🙋♂️ 作者:@Ggggggtm 🙋♂️
👀 专栏:数据结构与算法 👀
💥 标题:第十二届蓝桥杯省赛第二场 💥
❣️ 寄语:与其忙着诉苦,不如低头赶路,奋路前行,终将遇到一番好风景 ❣️
题目来源:第十二届蓝桥杯省赛第二场
题目难度:简单
题目描述:今年是 2021 年,2021 这个数字非常特殊,它的千位和十位相等,个位比百位大 1,我们称满足这样条件的年份为特殊年份。输入 5 个年份,请计算这里面有多少个特殊年份。
输入格式:输入 5 行,每行一个 44 位十进制数(数值范围为 1000 至 9999),表示一个年份。
输出格式:输出一个整数,表示输入的 55 个年份中有多少个特殊年份。
输入样例:
2019 2021 1920 2120 9899输出样例:
2样例解释:2021 和 9899 是特殊年份,其它不是特殊年份。
这道题的思路什么简单,我们只需要将年份的各个数字拿出来,看是否满足:它的千位和十位相等,个位比百位大 1 即可。我们直接看代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int cnt=0;
int ret=0;
for(int i=0;i<5;i++)
{
scanf("%d",&ret);
int a=ret/1000,b=ret/100%10,c=ret%100/10,d=ret%10;
if(a==c && d-b==1)
cnt++;
}
cout<<cnt;
return 0;
}
题目来源:第十二届蓝桥杯省赛第二场
题目难度:简单
题目描述:小蓝发现,对于一个正整数 n 和一个小于 n 的正整数 v,将 v 平方后对 n 取余可能小于 n 的一半,也可能大于等于 n 的一半。请问,在 1 到 n−1中,有多少个数平方后除以 n 的余数小于 n 的一半。
例如,当 n=4时,1,2,3的平方除以 4 的余数都小于 4 的一半。
又如,当 n=5时,1,4 的平方除以 5 的余数都是 1,小于 5 的一半。
而 2,3 的平方除以 5 的余数都是 4,大于等于 5 的一半。
输入格式:
输入一行包含一个整数 n。
输出格式:
输出一个整数,表示满足条件的数的数量。
数据范围:
1≤n≤10000
输入样例:
5输出样例:
2
由于数据范围较小,所以我们直接暴力枚举即可。我们直接看代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
int cnt=0;
cin>>n;
for(int i=1;i<n;i++)
{
if((i*i)%n*2 < n)
cnt++;
}
cout<<cnt;
return 0;
}
题目来源:第十二届蓝桥杯省赛第二场
题目难度:简单
题目描述:一个整数 a 是一个完全平方数,是指它是某一个整数的平方,即存在一个整数 b,使得 a=b*b。给定一个正整数 n,请找到最小的正整数 x,使得它们的乘积是一个完全平方数。
输入格式:
输入一行包含一个正整数 n。
输出格式:
输出找到的最小的正整数 x。
数据范围:
对于 30% 的评测用例,1≤n≤1000,答案不超过 1000。
对于 60% 的评测用例,1≤n≤1e8,答案不超过 1e8。
对于所有评测用例,1≤n≤1e12,答案不超过 1e12。输入样例1:
12输出样例1:
3输入样例2:
15输出样例2:
15
从题目中给出的数据范围可知,我们如果暴力去找最小的数,是不行的。这里就用到了质因数。如果一个数完全平方数,那么这个数的所有质因数的个数为偶数。根据这一特点,我们就判单题目中给出的数据,找出该数据的质因数个数为奇数的,然后相互乘起来就是我们所要的结果。我们结合代码一起理解一下。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
LL n;
scanf("%lld",&n);
LL res=1;
for(LL i=2;i*i<=n;i++)
{
if(n%i==0)
{
int s=0;
while(n%i==0)
{
n/=i;
s++;
}
if(s%2)
res*=i;
}
}
if(n>1)
res*=n;
cout<<res;
return 0;
}
题目来源:第十二届蓝桥杯省赛第二场
题目难度:中等
题目描述:有 n 台计算机,第 i台计算机的运算能力为 vi。有一系列的任务被指派到各个计算机上,第 i 个任务在 ai 时刻分配,指定计算机编号为 bi,耗时为 ci 且算力消耗为 di。如果此任务成功分配,将立刻开始运行,期间持续占用 bi 号计算机 di 的算力,持续 ci 秒。对于每次任务分配,如果计算机剩余的运算能力不足则输出 −1,并取消这次分配,否则输出分配完这个任务后这台计算机的剩余运算能力。
输入格式:
输入的第一行包含两个整数 n,m,分别表示计算机数目和要分配的任务数。
第二行包含 n 个整数 v1,v2,⋅⋅⋅vn,分别表示每个计算机的运算能力。接下来 m 行每行 4 个 整数 ai,bi,ci,di,意义如上所述。数据保证 ai 严格递增,即 ai<ai+1。
输出格式:
输出 m 行,每行包含一个数,对应每次任务分配的结果。
数据范围:
对于 20% 的评测用例,n,m≤200。
对于 40% 的评测用例,n,m≤2000。
对于所有评测用例,1≤n,m≤200000,1≤ai,ci,di,vi≤1e9,1≤bi≤n。输入样例:
2 6 5 5 1 1 5 3 2 2 2 6 3 1 2 3 4 1 6 1 5 1 3 3 6 1 3 4输出样例:
2 -1 -1 1 -1 0样例解释:
时刻 1,第 1 个任务被分配到第 1 台计算机,耗时为 5,这个任务时刻 6 会结束,占用计算机 1 的算力 3。
时刻 2,第 2 个任务需要的算力不足,所以分配失败了。
时刻 3,第 1 个计算机仍然正在计算第 1 个任务,剩余算力不足 3,所以失败。
时刻 4,第 1 个计算机仍然正在计算第 1 个任务,但剩余算力足够,分配后剩余算力 1。
时刻 5,第 1 个计算机仍然正在计算第 1,4 个任务,剩余算力不足 4,失败。
时刻 6,第 1 个计算机仍然正在计算第 4 个任务,剩余算力足够,且恰好用完。
该题目输入的时刻是保证有序的。但是每个任务需要花费的时间是一段时间段,这似乎是一个很棘手的问题。我们看每个计算机是否能进行此任务,关键是要看该计算机的剩余的算力是否足够。我们发现每个计算机都是独立的,我们需要去维护每个时刻的算力和运行的任务。如果某个时刻前面的任务已经结束,我们需要重新加回该任务所消耗的算力值。我们可以考虑用一下优先队列来去维护计算机的算力和运行的任务。我们需要定义pair来存储某个任务结束的时间点和所需算力值。我们结合代码理解:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII; //first :某个任务结束的时间点。 second :该任务所需算力值
const int N=2e5+10;
int n,m;
int s[N]; //存储剩余的算力
priority_queue<PII,vector<PII>,greater<PII>> q[N]; //小根堆。存储正在计算的任务
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&s[i]);
while(m--)
{
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
while(q[b].size() && q[b].top().x<=a) //判断是否寂静有任务结束
{
s[b]+=q[b].top().y;
q[b].pop();
}
if(s[b]<d)
puts("-1");
else
{
s[b]-=d;
q[b].push({a+c,d});
printf("%d\n",s[b]);
}
}
return 0;
}
题目来源:第十二届蓝桥杯省赛第二场
题目难度:困难
题目描述: 众所周知,“八皇后” 问题是求解在国际象棋棋盘上摆放 88 个皇后,使得两两之间互不攻击的方案数。已经学习了很多算法的小蓝觉得 “八皇后” 问题太简单了,意犹未尽。作为一个国际象棋迷,他想研究在 N×M 的棋盘上,摆放 K 个马,使得两两之间互不攻击有多少种摆放方案。由于方案数可能很大,只需计算答案除以 1000000007 (即 1e9+7) 的余数。
如下图所示,国际象棋中的马摆放在棋盘的方格内,走 “日” 字,位于 (x,y) 格的马(第 x 行第 y 列)可以攻击 (x+1,y+2)、(x+1,y−2)、(x−1,y+2)、(x−1,y−2)、(x+2,y+1)、(x+2,y−1)、(x−2,y+1) 和 (x−2,y−1) 共 8 个格子。
![]()
输入格式:
输入一行包含三个正整数 N,M,K,分别表示棋盘的行数、列数和马的个数。
输出格式:
输出一个整数,表示摆放的方案数除以 1000000007 (即 1e9+7) 的余数。
数据范围:
对于 5% 的评测用例,K=1;
对于另外 10% 的评测用例,K=2;
对于另外 10% 的评测用例,N=1;
对于另外 20% 的评测用例,N,M≤6,K≤5;
对于另外 25% 的评测用例,N≤3,M≤20,K≤12;
对于所有评测用例,1≤N≤6,1≤M≤100,1≤K≤20。输入样例1:
1 2 1输出样例1:
2输入样例2:
4 4 3输出样例2:
276输入样例3:
3 20 12输出样例3:
914051446
以下题解来自于Acwing。
我们首先将问题化简一下,首先考虑一个n行m列的棋盘最多能有多少种摆放方式,能够不发生冲突。如果采用dfs的思想我们是一定会超时的,此时一看n是小于6的那么我们就可以采用状态压缩递推出方法数。然后我们此时一看他的限制条件,是一个日字型,与前面两列都是有关的,所以我们的状态至少要保持前面两列的状态。思考完这些我们便可以推算出全部的摆放方式,在来思考摆放的个数限制条件,我们可以在加一个维度来记录即可。我们结合代码一起理解:
#include<iostream>
using namespace std;
const int N=1<<6;
const int M=110;
const int T=30;
const int mod=1e9+7;
typedef long long ll;
ll f[M][N][N][T];//f[i][a][b][t] i 代表前i列 a代表前前列,b代表前面一列的状态集合 t代表已经用过多少个棋子
int lowit(int x){//计算当前列增加了多少个棋子
int res=0;
for(;x;x-=(x&-x))res++;
return res;
}
int main(){
int n,m,k;
cin>>n>>m>>k;
int maxn=1<<n;
f[0][0][0][0]=1;//初始化
for(int i=1;i<=m;i++)
for(int a=0;a<maxn;a++)
for(int b=0;b<maxn;b++)
if((a>>2)&b||a&(b>>2))continue;//判断前前列和前列有没有发生冲突剪枝
else
for(int c=0;c<maxn;c++){
if((c>>2)&b||c&(b>>2))continue;//判断前列和当前列有没有发生冲突
if((c>>1)&a||c&(a>>1))continue;//判断前前列和当前列有没有发生冲突
int t=lowit(c);
for(int tt=t;tt<=k;tt++)//背包计算个数
f[i][b][c][tt]=(f[i][b][c][tt]+f[i-1][a][b][tt-t])%mod;
}
int res=0;
for(int i=0;i<maxn;i++)//对前前列和前列不同的状态最终有多少个可以摆放的方案数
for(int j=0;j<maxn;j++)
res=(res+f[m][i][j][k])%mod;
cout<<res;
}
有没有办法跳过CSV文件的第一行,让第二行作为标题?我有一个CSV文件,第一行是日期,第二行是标题,所以我需要能够在遍历它时跳过第一行。我尝试使用slice但它会将CSV转换为数组,我真的很想将其读取为CSV,以便我可以利用header。 最佳答案 根据您的数据,您可以使用另一种方法和skip_lines-option此示例跳过所有以#开头的行require'csv'CSV.parse(DATA.read,:col_sep=>';',:headers=>true,:skip_lines=>/^#/#Markcomments!)do|
目录前言: 一、ASC分析代码实现二、 卡片分析代码实现三、 直线分析代码实现四、货物摆放分析代码实现小结:前言: 在刷题的过程中,发现蓝桥杯的题目和力扣的差别很大。让人有一种不一样的感觉,蓝桥杯题目偏向对于实际问题用编程去的解决,而力扣给人感觉很锻炼自己的编程思维,逻辑能力。两者结合去刷,相信会有不一样的收获。 一、ASC 已知大写字母A的ASCII码为65,请问大写字母L的ASCII码是多少?分析 这道题目看上去很简单,我们需确定自己计算的准确,所以我建议用编程去解决。代码实现publicclassTest8{publicstaticvoidmain(String[]args){Sy
一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su
TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是
使用method_missing时在Ruby中,它是almostalwaysagoodidea定义respond_to_missing?respond_to_missing?接受两个参数;我们正在检查的方法的名称(symbol),以及一个指示我们是否应该在检查中包含私有(private)方法的bool值(include_all)。现在我感到困惑的是:method_missing不接受任何可能指示它是否应该调用私有(private)方法的参数,如respond_to_missing?做。此外,method_missing无论原始方法调用是在公共(public)上下文还是私有(privat
我正在对用户的提要进行分页,并想模拟我正在使用的API的响应。API可以返回奇怪的结果,所以我想确保如果API返回我已经看到的项目,请停止分页。我使用minitest在第一次调用方法get_next_page时stub,但我想在第二次和第三次用不同的值调用它时stub。我应该只使用rSpec吗?ruby新手...这是片段test"crawlerdoesnotpaginateifnonewitemsinnextpage"do#1:A,B#2:B,D=>D#3:A=>stopcrawler=CrawlJob.newfirst_page=[{"id"=>"item-A"},{"id"=>"i
我似乎找不到一种优雅的方式来做到这一点......给定一个日期,我如何找到下一个星期二,即日历月的第2个或第4个星期二?例如:给定2012-10-19然后返回2012-10-23或给定2012-10-31然后返回2012-11-13OctoberNovemberSuMoTuWeThFrSaSuMoTuWeThFrSa12345612378910111213456789101415161718192011121314151617212223242526271819202122232428293031252627282930 最佳答案
开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建
文章目录概念索引相关操作创建索引更新副本查看索引删除索引索引的打开与关闭收缩索引索引别名查询索引别名文档相关操作新建文档查询文档更新文档删除文档映射相关操作查询文档映射创建静态映射创建索引并添加映射概念es中有三个概念要清楚,分别为索引、映射和文档(不用死记硬背,大概有个印象就可以)索引可理解为MySQL数据库;映射可理解为MySQL的表结构;文档可理解为MySQL表中的每行数据静态映射和动态映射上面已经介绍了,映射可理解为MySQL的表结构,在MySQL中,向表中插入数据是需要先创建表结构的;但在es中不必这样,可以直接插入文档,es可以根据插入的文档(数据),动态的创建映射(表结构),这就
?作者主页:静Yu?简介:CSDN全栈优质创作者、华为云享专家、阿里云社区博客专家,前端知识交流社区创建者?社区地址:前端知识交流社区?博主的个人博客:静Yu的个人博客?博主的个人笔记本:前端面试题个人笔记本只记录前端领域的面试题目,项目总结,面试技巧等等。接下来会更新蓝桥杯官方系统基础练习的VIP试题,依然包括解题思路,源代码等等。问题描述:给定当前的时间,请用英文的读法将它读出来。时间用时h和分m表示,在英文的读法中,读一个时间的方法是: 如果m为0,则将时读出来,然后加上“o’clock”,如3:00读作“threeo’clock”。 如果m不为0,则将时读出来,然后将分读出来,如5