2020年第11届蓝桥杯C++B组 第一次省赛真题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

试题 A: 跑步训练

答案:3880

#include

using namespace std;

int main(void)

{

int n = 10000, minu, sec;

for (int i = 0; ; i++) {

if (i % 2 == 0) { // 跑

if (n > 600) {

n -= 600;

} else { // 体力不足跑完一分钟

minu = i;

sec = n / 10;

break;

}

} else { // 休息

n += 300;

}

}

cout << (minu * 60 + sec) << endl;

return 0;

}

试题 B: 纪念日

答案:52038720

可以通过excel来计算出,两个日期相差36138天

所以答案为:36138*24*60=52038720

试题 C: 合并检测

答案:10

假设有n个人,需要使用的试剂盒有

n / k + 0.01 ∗ n ∗ k n/k+0.01*n*k n/k+0.01∗n∗k

提取n,有

n ∗ ( 1 / k + 0.01 ∗ k ) n*(1/k+0.01*k) n∗(1/k+0.01∗k) 所以,当k=10时,有最小值

试题 D: REPEAT 程序

答案:241830

这道题我只会转换为python的做法

可以先用记事本打开prog.txt,再进行替换。

将“REPEAT” 替换为“for i in range(”,再将“:” 替换为“):”此时就把代码转换成了python,运行之后的结果是 241830

试题 F: 整除序列

模拟

#include using namespace std; typedef long long ll;

int main(void)

{

ll n;

cin >> n;

cout << n;

n /= 2;

while (n > 0) {

cout << " " << n;

n /= 2;

}

cout << endl;

return 0;

}

试题 G: 解码

模拟,将简写的字符串展开#include using namespace std; typedef long long ll;

int main(void)

{

string s;

cin >> s;

int n = s.size(), num;

for (int i = 0; i < n; i++) {

if (i != n - 1 && s[i + 1] >= '1' && s[i + 1] <= '9') { num = s[i + 1] - '0';

while (num--) {

cout << s[i];

}

i++;

} else {

cout << s[i];

}

}

cout << endl;

return 0;

}

试题 H: 走方格

简单的动态规划

#include using namespace std; typedef long long ll;

int dp[35][35];

int main(void)

{

int n, m;

cin >> n >> m;

for (int i = 1; i <= max(n, m); i++)

dp[i][1] = dp[1][i] = 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] = 0;

else

dp[i][j] = dp[i - 1][j] + dp[i][j - 1];

}

}

cout << dp[n][m] << endl;

return 0;

}

试题 I: 整数拼接

直接进行拼接的复杂度为O ( n 2 ) O(n^2) O(n2),需要进行优化

如果x 和y 进行拼接,拼接后个位上的数为y 个位上的数

可以先计算出k 的0——9 倍个位上的数,并记录到数组里

如果y 个位上的数存在于数组,说明拼接后的数字有可能是k 的倍数,从而进行拼接判断

如果y 个位上的数不在数组内,说明拼接后的数组不可能是k 的倍

数,直接跳过即可

#include using namespace std; typedef long long ll; const int N = 1e5 + 5;

ll a[N], num[15];

bool vis[15];

ll connect(ll a, ll b)

{

ll bb = b;

while (bb != 0) {

a *= 10;

bb /= 10;

}

a += b;

return a;

}

int main(void)

相关文档
最新文档