蓝桥杯2022省B题解

  1. 九进制转十进制

答案:1478

  1. 顺子日期

枚举就行了

答案:14

  1. 刷题统计

统计整周后在细化

typedef long long ll;

ll a, b, n, k;
ll ans = 0;

int main() {
    cin >> a >> b >> n;
    k = a * 5 + b + b;
    ans += n / k * 7;
    n %= k;
    if (n <= a * 5) {
        ans += n / a + (n % a != 0);
    }
    else {
        n -= a * 5;
        ans += 6 + (n > b);
    }
    cout << ans << endl;
    return 0;
}
  1. 修建灌木

有两种情况:1从开始到该树2从被修剪过到下一次

int main()
{
    int n;cin>>n;
    for(int i=1;i<=n;i++)cout<<2*max(n-i,i-1)<<endl;
}
  1. X进制减法

typedef long long ll;
const ll MOD = 1000000007;
const int MAXM = 100005;

int n, ma, mb;
int a[MAXM], b[MAXM];
ll ans = 0, bac = 1;

int main() {
    cin >> n;
    cin >> ma;
    for (int i = 1; i <= ma; i++) {
        cin >> a[i];
    }
    cin >> mb;
    for (int i = 1; i <= mb; i++) {
        cin >> b[i];
    }
    int i = ma, j = mb;
    while (i > 0) {
        ans += (a[i] - b[j]) * bac;
        ans %= MOD;
        ll p = max(a[i], b[j]) + 1;
        bac *= max(p, 2LL);
        bac %= MOD;
        i--;
        if (j) j--;
    }
    cout << ans << endl;
    return 0;
}
  1. 统计子矩阵

主要使用前缀和

typedef long long ll;
const int N = 5e2+3;
int n, m, k;
int a[N][N];


int main(){
    ios::sync_with_stdio(false);
    cin >> n >> m >> k;
    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++){
            cin >> a[i][j];
            a[i][j] += a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1];
        }
    }

    ll ans = 0;
    for(int i=1; i<=m; i++){
        for(int j=i; j<=m; j++){
            for(int s = 1, t = 1; t <= n; t ++ ){
                while(s <= t && a[t][j] - a[s - 1][j] - a[t][i - 1] + a[s - 1][i - 1] > k) s ++ ;
                if(s <= t) ans += t - s + 1;
            }
        }
    }

    cout << ans << '\n';
}
  1. 积木画

主要考虑状态转移

//const int N = 1e7 + 1;
//int a[N][4],b,c[4][4] = { 1,1,1,1,0,0,1,1,0,1,0,1,1,0,0,0};
//int main()
//{
//    cin >> b;
//    a[1][0] = 1;
//    for (int i = 1; i <= b; i++)
//        for (int j = 0; j < 4; j++)
//            for (int k = 0; k < 4; k++)
//                a[i + 1][k] = (a[i + 1][k] + a[i][j] * c[j][k]) % 1000000007;
//    cout << a[b+1][0];
//}
  1. 扫雷

#define ll long long
const int N = 5e4 + 10;
const int M = 1e7;
struct node
{
    int x, y, r, nu;
    bool operator <(const node &t) const
    {
        if(x != t.x)
            return x < t.x;
        return y < t.y;
    }
}a[N];
int ans = 0;
int n, m;
int n1;
map<pair<int, int>, int> mp;
int h[N], ne[M], e[M], cnt;
int vis[N];
int num[N];
void add(int x, int y)
{
    e[cnt] = y, ne[cnt] = h[x], h[x] = cnt ++;
}

void dfs2(int x)
{
    vis[x] = 1;
    ans += a[x].nu;
    for(int i = h[x]; ~i; i = ne[i])
    {
        int v = e[i];
        if(vis[v] == 1) continue;
        dfs2(v);
    }
}
void dfs(int x, int y, int z)
{
    node e = {x - z - 1, y, z};
    node e1 = {x + z + 1, y, z};
    int l = lower_bound(a + 1, a + n1 + 1, e) - a;
    int r = lower_bound(a + 1, a + n1 + 1, e1) - a;
    l = min(n1, l);
    r = min(n1, r);//找到对应可能炸到的最远的炸弹
    for(int i = l; i <= r; i ++)
    {
        int tmp = abs(a[i].x - x) * abs(a[i].x - x) + abs(a[i].y - y) * abs(a[i].y - y) - z * z;
        if(tmp <= 0 && vis[i] == 0)
        {
            dfs2(i); // 引爆
        }
    }

}

int main()
{
    ios::sync_with_stdio(0);
    memset(h, -1, sizeof h);
    cin >> n >> m;
    for(int i = 1; i <= n; i ++)
    {
        int x, y, z;
        cin >> x >> y >> z;
        int tt = mp[{x, y}]; //数据去重,保证每个坐标唯一
        if(tt != 0) 
        {
            a[tt].r = max(a[tt].r, z);
            a[tt].nu ++;
        }
        else
        {
            a[++n1].x = x;
            a[n1].nu = 1;
            a[n1].y = y;
            a[n1].r = z;
            mp[{x, y}] = n1;
        }
    }
    mp.clear();
    sort(a + 1, a + n1 + 1);
    for(int i = 1; i <= n1; i ++) // 建图
    {
        mp[{a[i].x, a[i].y}] = i;
        int dis = a[i].r * a[i].r;
        for(int j = i - 1; j >= 1; j --)
        {
            int tmp1 = abs(a[i].x - a[j].x) * abs(a[i].x - a[j].x);
            if(tmp1 > dis) break;
            int tmp = abs(a[i].x - a[j].x) * abs(a[i].x - a[j].x) + abs(a[i].y - a[j].y) * abs(a[i].y - a[j].y);
            if(tmp <= a[i].r * a[i].r)
            {
                add(i, j);
            }
        }
        for(int j = i + 1; j <= n1; j ++)
        {
            int tmp1 = abs(a[i].x - a[j].x)* abs(a[i].x - a[j].x);
            if(tmp1 > dis) break;
            int tmp = abs(a[i].x - a[j].x)* abs(a[i].x - a[j].x) + abs(a[i].y - a[j].y) * abs(a[i].y - a[j].y);
            if(tmp <= a[i].r * a[i].r)
            {
                add(i, j);
            }
        }
    }
    for(int i = 1; i <= m; i++)
    {
        int x, y, z;
        cin >> x >> y >> z;
        dfs(x, y, z);
    }
    cout << ans << endl;
    return 0;
}
  1. 李白打酒加强版

const int N = 110, M = 1000000007;
int n, m, f[N][N][N];

int main()
{
    scanf("%d%d", &m, &n);

    for(int i = 0; i <= n; i ++ )
    {
        for(int j = 0; j <= m; j ++ )
        {
            for(int k = 0; k < N; k ++ )
            {
                if(i == 0 && j == 0 && k == 2)
                f[i][j][k] = 1;

                if(i == 0 && j == 0)
                continue;

                if(i > 0)
                f[i][j][k] = (f[i][j][k] + f[i - 1][j][k + 1]) % M;

                if(j > 0 && k % 2 == 0)
                f[i][j][k] = (f[i][j][k] + f[i][j - 1][k / 2]) % M;
            }
        } 
    }

    printf("%d", f[n - 1][m][1]);
    return 0;
} 
  1. 砍竹子

这题比较难,从acw题解借鉴来的

typedef long long LL;

const int N = 2e5 + 10;

LL a[N];
vector<LL> b[N];
int n;

LL solve(LL x) {
    return sqrt(x / 2 + 1);
}

int main() {
    scanf("%d", &n);

    for(int i = 1; i <= n; i ++ ) scanf("%lld", &a[i]);

    int res = 0;

    for(int i = 1; i <= n; i ++ ) {
        while(a[i] > 1) {
            int flag = 0;
            for(LL j : b[i - 1]) {
                if(a[i] == j) {
                    flag = 1;
                    break;
                }
            }
            if(!flag) res ++;
            b[i].push_back(a[i]);
            a[i] = solve(a[i]);
        }

    }
    printf("%d", res);

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
蓝桥杯是一个国内著名的计算机比赛,为了帮助参赛者更好地准备和了解比赛的题型,组委会会公布历年的真题并提供相应的题解。 首先,我们需要了解蓝桥杯是一个综合性的计算机比赛,测试的对象包括计算机基础知识、编程能力以及解决实际问题的能力。 在历年的真题中,参赛者将面临不同类型的题目,包括算法设计与优化问题、数据结构与算法问题、编程题等。其中针对Python B组的题目主要考察的是对Python语言的掌握和应用能力。 题目解答一般会包含以下几个方面的内容: 1. 题目分析与理解:读取题目,理解题目的要求和限制条件。通过仔细分析题目,确定题目的输入与输出,以及问题的核心。 2. 设计解决方案:根据题目要求和限制条件,设计一个合适的解决方案。可以使用合适的算法和数据结构来解决问题,并做出相应的性能优化。 3. 编写代码实现:根据设计的方案编写相应的代码实现。需要注意的是,Python语言有其独特的语法和特性,掌握好这些特性可以更好地完成编程任务。 4. 调试与测试:编写完代码后,需要进行调试和测试。通过运行样例输入和输出,检查代码是否符合题目要求,并且没有逻辑上的错误。 5. 总结与优化:在完成题目解答后,可以进行总结和优化。包括分析算法复杂度、代码风格和可读性等方面,以便在比赛中更好地表现。 在准备蓝桥杯时,可以通过阅读历年的真题和题解来了解比赛的难度和类型,针对性地进行练习和提高。同时也可以参加相关的培训班和讨论活动,与其他参赛者交流经验和技巧。 总而言之,历年蓝桥杯真题的解答对于提高自己的编程能力和应对比赛非常有帮助。通过认真分析和实践,可以更好地理解并掌握Python编程,并在比赛中取得更好的成绩。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值