第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;
}
相关推荐
第九序言T7 小时前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
m0_639906947 小时前
Redis入门|五种数据结构、使用场景、持久化RDB&AOF
数据结构·数据库·redis
Sakura_j_h_8 小时前
EasyEDA PCB 快速设计Skills
c++·python·github
ZhengEnCi8 小时前
Agent 架构怎么选:从单 Agent 到多 Agent 编排的选型决策指南
算法·架构
龙亘川8 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
程序喵大人8 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
秋天的怀念_David9 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Raas1009 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
Pniubi9 小时前
力扣283移动零(双指针法)
算法·leetcode·职场和发展
hhb_6189 小时前
大模型落地三重优化实战
人工智能·算法·机器学习