P8704 [蓝桥杯 2020 省 A1] 填空问题 题解

· · 题解

P8704 [蓝桥杯 2020 省 A1] 填空问题 题解

problem A

数学题。

这一题跟蜗牛爬井盖相似,我们经过推算后可以发现 64 分钟过后小明已经消耗了 9600 体力,他的体力已经不足 600 了,所以我们可以用 64 \times 60 + (10000 - 9600) \div 10 来推出答案。

答案:3880

problem B

枚举题。

A 国人数数量为 500000,然后分别枚举 1 \sim 99,看哪一个用的试剂盒最少即可。

核心代码:

int now, best;
now = n / i + n / 100 * i; 
best = n / res + n / 100 * res; 
if (now < best)
   res = i;

答案:10

problem C

典型搜索题。

每一次搜索每批口罩给 A,B 两所医院的情况,如果分完了就更新最小值。

核心代码:

void dfs(int step, int x, int y)
{
    if (step > 15)//分完了
    {
        if (abs(x - y) < ans)
            ans = abs(x - y);//如小于则更新答案
        return;
    }
   //往下搜索
    dfs(step + 1, x + a[step], y);//给 A 
    dfs(step + 1, x, y + a[step]);//给 B 
}

答案:2400

problem D

dp 题。

我们可以发现每个数要不放在第一行,要不放在第二行,所以我们可以把两种情况讨论。

状态转移方程:

第一行:

f_{i, j} = f_{i, j} + f_{i - 1, j} \bmod 2020

第二行:

f_{i, j} = f_{i, j} + f_{i, j - 1} \bmod 2020

答案:1340

problem E

枚举题。

我们可以发现,只要满足是完全平方数和是 0, 1, 4, 9 构成的即可。

核心代码(判断数位):

if ((nn % 10) != 0 && (nn % 10) != 1 && (nn % 10) != 4 && (nn % 10) != 9)
{
    f = 0;
    break;
}
nn /= 10;

答案:1499441040

代码

#include<iostream>
using namespace std;
int main() {
    string ans [] = {
        "3880", // 双引号中替换为 A 题的答案
        "10", // 双引号中替换为 B 题的答案
        "2400", // 双引号中替换为 C 题的答案
        "1340", // 双引号中替换为 D 题的答案
        "1499441040", // 双引号中替换为 E 题的答案
    };
    char T;
    cin >> T;
    cout << ans[T - 'A'] << endl;
    return 0;
}