第15届省赛蓝桥杯大赛C/C++大学B组

目录

一.握手问题

1.题目讲解

2.代码实现

二.小球反弹

1.题目讲解

2.代码实现

三.好数

1.题目讲解

2.代码实现

[四.R 格式](#四.R 格式)

1.题目讲解

2.代码实现

五.宝石组合

1.题目讲解

2.代码实现

六.数字接龙

1.题目讲解

2.代码实现

七.拔河

1.题目讲解

2.代码实现


一.握手问题

题目链接:https://www.lanqiao.cn/problems/19695/learning/

1.题目讲解

2.代码实现

cpp 复制代码
#include <iostream>

using namespace std;

int main()
{
    cout << (50 * 49 - 7 * 6) / 2 << endl;

    return 0;
}

二.小球反弹

题目链接:https://www.lanqiao.cn/problems/19732/learning/

1.题目讲解

2.代码实现

cpp 复制代码
#include <iostream>
#include <cmath>

using namespace std;

typedef long long LL;

LL gcd(LL a, LL b)
{
    return b == 0 ? a : gcd(b, a % b);
}

int main()
{
    LL x = 15 * 233333, y = 17 * 343720;
    LL d = gcd(x, y);

    LL a = x / d * 2 * 343720, b = y / d * 2 * 233333;
    printf("%.2lf", sqrt(a * a + b * b));

    return 0;
}

三.好数

题目链接:https://www.lanqiao.cn/problems/19709/learning/

1.题目讲解

直接暴力就可以了

2.代码实现

cpp 复制代码
#include <iostream>

using namespace std;

bool check(int x)
{
    int i = 1;
    while(x)
    {
        if((x % 10) % 2 != i % 2) return false;
        x /= 10;
        i++;
    }
    return true;
}

int main()
{
    int n; cin >> n;
    int ret = 0;
    for(int i = 1; i <= n; i++)
        if(check(i))
            ret++;
    
    cout << ret << endl;

    return 0;
}

四.R 格式

题目链接:https://www.lanqiao.cn/problems/19710/learning/

1.题目讲解

2.代码实现

cpp 复制代码
#include <iostream>

using namespace std;

const int N = 1e6 + 10;

int n;
string d;

int a[N], len, p;

void mul()
{
    // 不断乘 2
    int c = 0;
    for(int i = 0; i < len; i++)
    {
        a[i] = a[i] * 2 + c;
        c = a[i] / 10;
        a[i] %= 10;
    }
    if(c) a[len++] = c;
}

int main()
{
    cin >> n >> d;
    len = d.size() - 1;

    for(int i = 0, t = len - 1; i < d.size(); i++)
    {
        if(d[i] == '.') p = d.size() - i - 1; // 小数点后的位数
        else a[t--] = d[i] - '0'; // 把浮点数逆序放在 a 数组中
    }

    // 乘 n 次 2
    for(int i = 1; i <= n; i++) mul();

    // 判断四舍五入
    if(a[p - 1] >= 5)
    {
        int c = 1;
        for(int i = p; i < len && c; i++)
        {
            a[i] = a[i] + c;
            c = a[i] / 10;
            a[i] %= 10;
        }
        if(c) a[len++] = c;
    }

    for(int i = len - 1; i >= p; i--) cout << a[i];

    return 0;
}

五.宝石组合

题目链接:https://www.lanqiao.cn/problems/19711/learning/

1.题目讲解

2.代码实现

cpp 复制代码
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1e5 + 10;

int n, a[N], cnt[N];

void get_d(int x)
{
    for(int i = 1; i <= x / i; i++)
    {
        if(x % i == 0)
        {
            cnt[i]++;
            if(i != x / i) cnt[x / i]++;
        }
    }
}

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++)
    {
        cin >> a[i];
        get_d(a[i]); // 预处理每一个数的约数
    }

    // 找最大的公约数
    int x;
    for(int i = 1e5; i >= 0; i--)
    {
        if(cnt[i] >= 3)
        {
            x = i;
            break;
        }
    }

    // 找出最小的三个数
    sort(a + 1, a + 1 + n);
    for(int i = 1, sum = 0; i <= n; i++)
    {
        if(a[i] % x == 0)
        {
            cout << a[i] << " ";
            sum++;
        }
        if(sum == 3) break;
    }

    return 0;
}

六.数字接龙

题目链接:https://www.lanqiao.cn/problems/19712/learning/

1.题目讲解

2.代码实现

cpp 复制代码
#include <iostream>
#include <vector>

using namespace std;

const int N = 15;

int n, k;
int g[N][N];
bool st[N][N], check[N][N][N][N];
vector<int> path;

int dx[] = {-1, -1, 0, 1, 1, 1, 0, -1};
int dy[] = {0, 1, 1, 1, 0, -1, -1, -1};

bool dfs(int a, int b)
{
    if(a == n - 1 && b == n - 1)
    {
        if(path.size() == n * n - 1) return true;
        else return false;
    }

    st[a][b] = true;
    for(int i = 0; i < 8; i++) // 保证字典序最小
    {
        int x = a + dx[i], y = b + dy[i];
        if(x < 0 || x >= n || y < 0 || y >= n || st[x][y]) continue;
        if((g[a][b] + 1) % k != g[x][y]) continue;
        if(i % 2 == 1 && (check[a][y][x][b] || check[x][b][a][y])) continue;

        path.push_back(i);
        check[a][b][x][y] = true;
        if(dfs(x, y)) return true;

        path.pop_back();
        check[a][b][x][y] = false;
    }

    st[a][b] = false;
    return false;
}

int main()
{
    cin >> n >> k;
    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++)
            cin >> g[i][j];
    
    if(!dfs(0, 0)) cout << -1 << endl;
    else
    {
        for(auto x : path) cout << x;
    }

    return 0;
}

七.拔河

题目链接:https://www.lanqiao.cn/problems/19713/learning/

1.题目讲解

2.代码实现

cpp 复制代码
#include <iostream>
#include <set>

using namespace std;

typedef long long LL;
const int N = 1e5 + 10;

int n;
LL a[N];
set<LL> mp;

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];

    LL ret = 1e9; 
    for(int l = 2; l <= n; l++)
    {
        LL sum = 0;
        // 把新产生的区间和,放进 set 中
        for(int i = l - 1; i >= 1; i--)
        {
            sum += a[i];
            mp.insert(sum);
        }

        sum = 0;
        // 枚举右区间
        for(int r = l; r <= n; r++)
        {
            sum += a[r];
            // 在左边区域快速找出离 sum 最近的区间和
            auto it = mp.lower_bound(sum);
            if(it != mp.end()) ret = min(ret, *it - sum);
            if(it != mp.begin())
            {
                it--;
                ret = min(ret, sum - *it);
            }
        }
    }

    cout << ret << endl;

    return 0;
}
相关推荐
阿里嘎多学长3 小时前
2026-04-30 GitHub 热点项目精选
开发语言·程序员·github·代码托管
j_xxx404_5 小时前
Linux:静态链接与动态链接深度解析
linux·运维·服务器·c++·人工智能
叶小鸡5 小时前
Java 篇-项目实战-苍穹外卖-笔记汇总
java·开发语言·笔记
AI人工智能+电脑小能手5 小时前
【大白话说Java面试题】【Java基础篇】第22题:HashMap 和 HashSet 有哪些区别
java·开发语言·哈希算法·散列表·hash
昵称小白5 小时前
复杂度分析方法
算法
科研前沿5 小时前
2026 数字孪生前沿科技:全景迭代报告 —— 镜像视界生成式孪生(Generative DT)技术白皮书
大数据·人工智能·科技·算法·音视频·空间计算
c++之路6 小时前
C++23概述
java·c++·c++23
时空系6 小时前
第10篇:继承扩展——面向对象编程进阶 python中文编程
开发语言·python·ai编程
CHANG_THE_WORLD7 小时前
python 批量终止进程exe
开发语言·python
古城小栈7 小时前
从 cargo-whero 库中,找到提升 rust 的契机
开发语言·后端·rust