第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;
}
相关推荐
charlie1145141912 小时前
嵌入式Linux模块开发——struct module 深度解析:内核模块的核心数据结构
linux·开发语言·数据结构·c
无缘之缘2 小时前
蓝桥杯手把手教你备战(C/C++ B组)(最全面!最贴心!适合小白!)
c语言·c++·算法·蓝桥杯
吴声子夜歌2 小时前
ES6——Symbol详解
开发语言·javascript·es6
星辰徐哥2 小时前
C语言运算符的优先级与结合性详解
c语言·开发语言
HZ·湘怡2 小时前
顺序表 2 续集 c 实现增删查改
c语言·开发语言·顺序表
Dfreedom.2 小时前
【实战篇】神经网络在回归任务中的应用
人工智能·神经网络·算法·机器学习·回归
han_hanker2 小时前
js 加减乘除精度问题2
开发语言·javascript·ecmascript
红目香薰2 小时前
Ascend C 算子:Sigmoid 函数原理深入解析与工程化构建及验证
c语言·开发语言·华为·华为云·昇腾·cann·modelarts
OTWOL2 小时前
C语言操作符终极揭秘:表达式求值秘籍
c语言·开发语言·c++