admin管理员组文章数量:1516870
第十一届蓝桥杯省赛B组(C/C++组)(第一场)
目录
- A:跑步训练
- B:纪念日
- C:合并检测
- D:REPEAT程序
- E:矩阵
- F:整除序列
- G:解码
- H:走方格
- I:整数拼接
A:跑步训练
【题目描述】
小明要做一个跑步训练。
初始时,小明充满体力,体力值计为 10000。如果小明跑步,每分钟损耗 600 的体力。如果小明休息,每分钟增加 300 的体力。体力的损耗和增加都是 均匀变化的。
小明打算跑一分钟、休息一分钟、再跑一分钟、再休息一分钟……如此循环。如果某个时刻小明的体力到达 0,他就停止锻炼。
请问小明在多久后停止锻炼。为了使答案为整数,请以秒为单位输出答案。
答案中只填写数,不填写单位。
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
【题目解析】
每两分钟消耗300体力。则10000➗300=33…100 即62分钟后还剩下700体力,可以跑满下一分钟,64分钟后还剩下400体力,可以继续跑,但是跑不满一分钟。因为600体力跑1分钟,所以400体力跑4/6分钟即40秒。总共需要64*60+40=3880秒
#include <iostream>using namespace std;int main()
{cout<<64*60+40;return 0;
}
B:纪念日
【题目描述】
2020 年 7 月 1 日是A组织 成立 99 周年纪念日。
A组织成立于 1921 年 7 月 23 日。
请问从 1921 年 7 月 23 日中午 12 时到 2020 年 7 月 1 日中午 12 时一共包含多少分钟?
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
【题目解析】
已知闰年有366天,平年有365天。从1922年到2019年共有24个闰年,74个平年。1921 年 7 月 23 日中午 12 时到1921年12月31日0时共有31 * 3+30 * 2+29天,2019年12月31日24时到2020 年 7 月 1 日中午 12 时共有8+31 * 3+30 * 2天,再加上两个半天12 * 2
#include <iostream>using namespace std;int main()
{int run=0,ping=0,sum=0;for(int i=1922;i<=2019;i++){if(i%400==0 || i%4==0 && i%100!=0)run++;elseping++;}sum=run*366+ping*365;sum=sum*24+24*(8+31*3+30*2 + 31*3+30*2+29)+12*2;cout<<sum*60;return 0;
}
C:合并检测
【题目描述】
疫情最近在 A 国蔓延,为了尽快控制 疫情,A 国准备给大量民众进病毒核酸检测。然而,用于检测的试剂盒紧缺。为了解决这一困难,科学家想了一个办法:合并检测。即将从多个人(k个)采集的标本放到同一个试剂盒中进行检测。如果结果为阴性,则说明这 k个人都是阴性,用一个试剂盒完成了 k 个人的检测。如果结果为阳性,则说明至少有一个人为阳性,需要将这 k 个人的样本全部重新独立检测(从理论上看,如果检测前 k - 1 个人都是阴性可以推断出第 k 个人是阳性,但是在实际操作中不会利用此推断,而是将 k 个人独立检测),加上最开始的合并检测,一共使用了 k + 1 个试剂盒完成了 k 个人的检测。A 国估计被测的民众的感染率大概是 1%,呈均匀分布。请问 k 取多少能最节省试剂盒?
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个
整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
【题目解析】
设A 国共有100M个民众,则大概有M个民众感染。一个组有K个人,额外需要M * K个试剂盒,一共分为100M/K个组(如果100M/K有余数,那么则为100M/K+1个组)。最坏的情况下这M个人分别被分散到不同的组中去,则这M个组每个组都需要K+1个试剂盒。当100M/K没有余数时,剩下100M/K-M个组,每个组只需要一个试剂盒。当100M/K有余数时,,剩下100M/K+1-M个组,每个组只需要一个试剂盒。
#include <iostream>using namespace std;
//M取1
int main()
{int k,sum,min=9999999,rek;//sum是当前k下总共需要的试剂盒数量,rek是最佳的kfor(k=1;k<=100;k++){if(100%k==0)sum=k+1+100/k-1;elsesum=k+1+100/k+1-1;if(min>sum){min=sum;rek=k;}}cout<<rek;return 0;
}
D:REPEAT程序
【问题描述】
如图是一个用某种语言写的程序。
其中REPEAT k表示一个次数为k的循环。循环控制的范围由缩进表达,从次行开始连续的缩进比该行多的(前面的空白更长的)为循环包含的内容。
例如如下片段:
该片段中从 A = A + 4 所在的行到 A = A + 8 所在的行都在第一行的 循环两次中。
REPEAT 6: 所在的行到 A = A + 7 所在的行都在 REPEAT 5: 循环中。
A = A + 5 实际总共的循环次数是 2 × 5 × 6 = 60 次。
请问该程序执行完毕之后,A 的值是多少?
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
#include <iostream>using namespace std;int main()
{int a=0;for(int i=0;i<2;i++){a=a+4;for(int j=0;j<5;j++){for(int k=0;k<6;k++)a=a+5;a=a+7;}a=a+8;}a=a+9;cout<<a;return 0;
}
E:矩阵
【题目描述】
把 1 ∼ 2020 放在 2 × 1010 的矩阵里。要求同一行中右边的比左边大,同一列中下边的比上边的大。一共有多少种方案?
答案很大,你只需要给出方案数除以 2020 的余数即可。
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
【题目解析】
设置数组dp[2][1010]
dp[i][j]表示第一层有i个数,第二层有j个数有多少种方案
要求同一行中右边比左边大, 同一列中下边比上边的大,所以 j <= i
1、当j < i时, dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
2、当j = i时,dp][j] = dp[i][j - 1]
#include <iostream>
using namespace std;int dp[1011][1011];
int main()
{for(int i=1;i<=1010;i++)dp[i][0]=1;for(int i=1;i<=1010;i++){for(int j=1;j<=i;j++){if(j<i)dp[i][j]=(dp[i-1][j]+dp[i][j-1])%2020;elsedp[i][j]=dp[i][j-1];}}cout<<dp[1010][1010];return 0;
}
F:整除序列
【题目描述】
有一个序列,序列的第一个数是 n,后面的每个数是前一个数整除 2,请输出这个序列中值为正数的项。
【输入描述】
输入一行包含一个整数 n。
【输出描述】
输出一行,包含多个整数,相邻的整数之间用一个空格分隔,表示答案。
【提示】
评测用例规模与约定
对于80%的评测用例,1≤n≤10^9
对于所有评测用例,1≤n≤10^18。
#include <iostream>using namespace std;int main()
{long long n;cin>>n;while(n>0){cout<<n<<" ";n/=2;}return 0;
}
G:解码
【题目描述】
小明有一串很长的英文字母,可能包含大写和小写。
在这串字母中,有很多连续的是重复的。小明想了一个办法将这串字母表达得更短:将连续的几个相同字母写成字母 + 出现次数的形式。
例如,连续的 5 个 a,即 aaaaa,小明可以简写成 a5(也可能简写成 a4a、 aa3a 等)。
对于这个例子:HHHellllloo,小明可以简写成 H3el5o2。为了方便表达,小明不会将连续的超过 9 个相同的字符写成简写的形式。
现在给出简写后的字符串,请帮助小明还原成原来的串。
【输入描述】
输入一行包含一个字符串。
【输出描述】
输出一个字符串,表示还原后的串。
【提示】
评测用例规模与约定
对于所有评测用例,字符串由大小写英文字母和数字组成,长度不超过 100。
请注意原来的串长度可能超过 100。
#include <iostream>using namespace std;int main()
{string str;cin>>str;int i=0;while(i<str.length()){if((str[i]<='z' && str[i]>='a') || (str[i]<='Z' && str[i]>='A'))cout<<str[i];if(str[i]<='9' && str[i]>='0'){for(int j=48;j<str[i]-1;j++)cout<<str[i-1];}i++;}return 0;
}
H:走方格
【题目描述】
在平面上有一些二维的点阵。
这些点的编号就像二维数组的编号一样,从上到下依次为第 1 至第 n 行,
从左到右依次为第 1 至第 m 列,每一个点可以用行号和列号来表示。
现在有个人站在第 1 行第 1 列,要走到第 n 行第 m 列。只能向右或者向下 走。
注意,如果行号和列数都是偶数,不能走入这一格中。
问有多少种方案。
【输入描述】
输入一行包含两个整数 n, m。
【输出描述】
输出一个整数,表示答案。
【题目解析】
使用int dp[n+1][m+1]表示走到第i行第j列的时候有几种方案。
初始化:点阵的边界 dp[i][1]=1 和 dp[1][j]=1
当走到坐标(i,j)时,有两种方式,一种是向下行走,从(i-1,j)走到的;另一种是向右行走,从(i,j-1)走到的。
因此走到坐标(i,j)时一共有dp[i-1][j]+dp[i][j-1]种方法。
当i和j都是偶数的时候,则当前位置的方案数为0。
#include <iostream>using namespace std;int main()
{int n,m;//行号和列号cin>>n>>m;int dp[n+1][m+1];//表示走到第i行第j列的时候有几种方案for(int i=1;i<=n;i++)dp[i][1]=1;for(int j=1;j<=m;j++)dp[1][j]=1;for(int i=2;i<=n;i++){for(int j=2;j<=m;j++){if(i%2!=0 || j%2!=0)dp[i][j]=dp[i-1][j]+dp[i][j-1];elsedp[i][j]=0;}}cout<<dp[n][m];return 0;
}
I:整数拼接
【题目描述】
给定义个长度为 n 的数组 A1, A2, · · · , An。你可以从中选出两个数 Ai (i 不等于 j),然后将 Ai 和 Aj 一前一后拼成一个新的整数。例如 12 和 以拼成 12345 或 34512。注意交换 Ai 和 Aj 的顺序总是被视为 2 种拼法,是 Ai = Aj 时。
请你计算有多少种拼法满足拼出的整数是 K 的倍数。
【输入】
第一行包含 2 个整数 n 和 K。
第二行包含 n 个整数 A1, A2, · · · , An。
【输出】
一个整数代表答案。
【评测用例规模与约定】
对于 30% 的评测用例,1 ≤ n ≤ 1000, 1 ≤ K ≤ 20, 1 ≤ Ai ≤ 10 ^ 4。
对于所有评测用例,1 ≤ n ≤ 10的五次方,1 ≤ K ≤ 10 ^ 5, 1 ≤ Ai ≤ 10 ^ 9。
【题目解析】
我超时了/(ㄒoㄒ)/~~
参考/
然后还是不太懂😔
#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;typedef long long ll;
const int N=100010;
int n,k;
ll ans;
int a[N];//cnt[i][j]记录在之前遍历过的所有数中,乘10^i后模k的结果为j的数的个数。
int cnt[11][N];//计算1 + log10(x)
int log_10(int x)
{int res=0;while(x){x/=10;res++;}return res;
}void work()
{for(int i=0;i<n;i++){ans+=cnt[log_10(a[i])][(k-a[i]%k)%k];for(int j=0,power=1;j<11;j++) //将a[i]的0~10次方 %k 的结果计入cnt{/*power先乘1ll,将power转成long long类型,再乘上a[i],才起到了避免爆 int 的效果如果先power*a[i],这个值就已经爆 int 了,再乘上1ll只是把一个已经溢出(由于溢出,值会是错误的)的 int 型整数转成了 long long 类型,没有任何作用*/cnt[j][power*1ll*a[i]%k]++; //a[i]^j %k结果为 a[i]%k的数的个数power=power*10%k;}}
}
int main()
{cin>>n>>k;for(int i=0;i<n;i++)cin>>a[i];work();memset(cnt,0,sizeof cnt); //在第二次跑之前清空cnt数组// 只需要将数组反转一下,再从前往后跑一遍即可reverse(a,a+n);work();cout<<ans;return 0;
}本文标签: 第十一届蓝桥杯省赛B组(CC组)(第一场)
版权声明:本文标题:第十一届蓝桥杯省赛B组(CC++组)(第一场) 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.betaflare.com/web/1687860784a150335.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。


发表评论