牛客小白月赛33

本文介绍了三个编程挑战的解决方案。A题涉及字符统计,通过读取输入的字符串段落计算段落数、单词数和字符数。B题是关于连分数的表示,通过递归实现连分数的转换。C题是挪酒瓶问题,计算将所有酒瓶挪到正确位置所需的最小工作量。这些题目考察了读取输入、逻辑处理和算法设计的能力。
摘要由CSDN通过智能技术生成

官方题解大全

A.字符统计

题目链接
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;

int main() {
    int t;
    string s;
    cin >> t;
    getchar();
    while (t--) {
        int duan = 0, word = 0, cntchar = 0;
        while (getline(cin, s), s != "=====") {
            if (cin.eof())
                break;
            cntchar += s.size();
            duan++;
            int cnt = 0, jd = 0;
            for (int i = 0; i < s.size(); i++) {
                if (s[i] != ' ') {
                    jd = 1;
                } else {
                    if (jd)
                        cnt++, jd = 0;
                    else
                        jd = 0;
                }
            }
            word += cnt + jd;
        }
        printf("%d %d %d\n", duan, word, cntchar);
    }
    return 0;
}

B.连分数

题目链接
在这里插入图片描述
在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;
int n, a, b, ta, tb;

void dfs(int a, int b) {
    cout << "+1/";
    if (a == 1) {
        cout << b;
        return;
    } else if (a != 1) {
        cout << "{";
        int k = b / a;
        cout << k;
        if (b % a != 0) {
            dfs(b % a, a);
        }
        cout << "}";
    }
}
inline int gcd(int a, int b) {
    if (a < b) {
        swap(a, b);
    }
    if (b == 0) {
        return a;
    }
    return gcd(b, a % b);
}

int main() {
    cin >> n;
    for (int i = 0; i < n; ++i) {
        cin >> a >> b;

        int k = a / b;
        cout << a << "/" << b << " = " << k;

        int p = gcd(a, b);
        a /= p, b /= p;

        if (a % b != 0) {
            dfs(a % b, b);
        }
        cout << endl;
    }
    return 0;
}

C.挪酒瓶

题目链接
在这里插入图片描述
在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
//v数组为1这表示酒瓶已到达正确位置,p数组记录要去的位置,w数组表示酒瓶重量
int p[100005], w[100005], v[100005];

int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        int n;
        scanf("%d", &n);
        for (int i = 1; i <= n; i++) {
            scanf("%d", &p[i]);
            v[i] = 0;
            if (p[i] == i)
                v[i] = 1;
        }
        int m1 = 105;
        ll sum = 0;
        for (int i = 1; i <= n; i++) {
            scanf("%d", &w[i]);
            m1 = min(m1, w[i]);
        }
        for (int i = 1; i <= n; i++) {
            if (v[i])
                continue;
            int x = i, m2 = 105, cnt = 0;
            while (!v[x]) {
                v[x] = 1;
                sum += w[x];
                m2 = min(m2, w[x]);
                x = p[x];
                cnt++;
            }
            sum +=
                min(m2 * (cnt - 2), (cnt - 2) * m1 + 2 * (m1 + m2) - m2 + m1);
        }
        cout << sum << endl;
    }
}

题解:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值