题解:P8740 [蓝桥杯 2021 省 A] 填空问题

· · 题解

前言

马蜂很差,不喜勿喷。

A 题

题目很好理解,代码也可以弄出来:

#include<bits/stdc++.h>
using namespace std;
int a[10];
int main(){
    for(int i=1;i<=10;i++)a[i-1]=2021;//赋值
    for(int i=0;i>=0;i++){
        int k=i;
        while(k)
        if(a[k%10]!=0)a[k%10]--,k/=10;//判断,可以就--
        else{cout<<i-1;return 0;} //不可以就输出
    }
}

算出来答案是 3181!

B 题:

本人是个蒟蒻,只有枚举才能会,大佬们应该都会吧。

算出来答案是 40257!

C 题:

这,三重循环暴力枚举啊,多么水!

枚举下因子个数就好了, 贴个主要代码吧。

for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    for(int k=1;k<=n;k++)
    if(a[i]*a[j]*a[k]==n)ans++;

算出来答案是 2430!

D 题

纯纯的最短路径,通过 Floyd(弗洛伊德) 来求就好了,算法简单,就不贴了。

算出来答案是 10266837!

E 题

状压 DP!

转移方程其他题解都讲的很好了,我就不推了。(还不是我菜)

算出来答案是 881012367360! (好长啊)

最终代码

#include<iostream>
using namespace std;
int main() {
    string ans [] = {
        "3181", 
        "40257",
        "2430",
        "10266837",
        "881012367360",
    };
    char T;
    cin >> T;
    cout << ans[T - 'A'] << endl;
    return 0;
}

欢迎大佬们指出错误!