2024cccc - GPLT选拔

文章描述了五个编程问题的解决方法,包括比较两个分数的大小、计算逆序和等差数列的最小公差、字符串回退操作、构造满足特定条件的数组和判断数组是否满足等价关系。
摘要由CSDN通过智能技术生成

A

输出即可

B

根据题意模拟即可,以下题解只写solve函数

#include <bits/stdc++.h>
using namespace std;
#define ios                      \
    ios::sync_with_stdio(false); \
    cin.tie(0);                  \
    cout.tie(0);
#define mian main
#define pii pair<int, int>
#define sz(x) ((int)x.size())
#define il inline
#define pii pair<int, int>
#define all(v) v.begin(), v.end()

typedef long long ll;
typedef unsigned long long ull;

const int N = 2e5 + 10;
const int INF = 0x3f3f3f3f;
const int mod = 998244353;

ll n, m, k, t;

ll res, ans, cnt;

il void solve()
{
    int a, b, c, d;
    cin >> t;
    while (t--) {
        cin >> a >> b >> c >> d;
        if (1.0 * a / b > 1.0 * c / d) {
            cout << 'S' << '\n';
        } else {
            cout << 'Y' << '\n';
        }
    }
}

int mian()
{
    ios;

    int _ = 1;

    while (_--) {
        solve();
    }

    return 0;
}

c

il void solve()
{
    cin >> n;
    for (int i = 1; i <= n; i++) {
        int x = 0, s = i;  // 拷贝一份
        while (s > 0) {
            x = x * 10 + s % 10;  //反向求和,s%10为取s的个位数,例,123取3
            s = s / 10;    // 删除s的个位数,例,123变成12
        }
        ans += (x == i ? 1 : 0);
    }
    cout << ans;
}

D

il void solve()
{
cin >> n;
    long double ans;
    ans = 1.0 * 1e9 + 1;
    for(int i = 1 ; i <= n ; i++){
        int x;
        cin >> x;
        long double z = 1.0 * (x + 1) / i;
        ans = min(ans, z);
        //由于一定存在合法的公差 x,所以我们可以直接枚举等
        //差数列每一项的可能最大值,直接计算出对这一项而言最
        //大合法的公差 xi。最终的答案 x 就应该是所有 xi的最小值。
    }
    printf("%.6Lf",ans);
}
// 关闭缓冲流时,不要使用scanf和printf

E

il void solve()
{
    cin >> t;
    while (t--) {
        string s, f;
        cin >> s >> f;
        bool flag = true;
        map<char, int> v;
        for (auto i : f) {
            v[i]++;
        }
        for (auto i : s) {
            if (!v.count(i))
                flag = false;
        }
        cout << (flag ? 10 : 0) << '\n';
        //  有不同的答案直接为0,否则就可以全都写对
    }
}

F

il void solve()
{
    cin >> t;
    while (t--) {
        cin >> n >> k;
        bool flag = true;
        for (int i = 1; i <= n; i++)
            cin >> a[i];
        a[1] -= k; // 让前面的数字尽量小一点,才能能形成递增
        for (int i = 2; i <= n; i++) {
            if (a[i] >= a[i - 1]) {
                if (a[i] > a[i - 1] + k) {
                    a[i] -= k;  // 前面的数字较大,尽量减小一点
                } else {
                    a[i] = a[i - 1]; // 减小范围在k以内就和之前的相等
                }
            } else {
                if (a[i - 1] - a[i] > k) {
                    flag = false;  //无法形成递增就判负
                    break;
                } else {
                    a[i] = a[i - 1]; // 同理
                }
            }
        }
        cout << (flag ? "Yes" : "No") << '\n';
    }
}

G

il void solve()
{
    cin >> n >> k;
    string s;
    cin >> s;
    for (int i = 1; i < n; i++) {
        if (s[i] == 'I') {
            t = i; //找到光标的位置
            break;
        }
    }
    while (k--) {
        string x;
        cin >> x;
        if (x == "backspace") {
            if (s[t - 1] == '(' && s[t + 1] == ')' && t > 0 && t + 1 < sz(s)) {
                s.erase(t + 1, 1); // 位置满足条件,就可以直接删
                s.erase(t - 1, 1);
                t--;
            } else if(t > 0){
                s.erase(t - 1, 1); // 不满足删一边
                t--;
            }     
        } else {
            if (t + 1 < sz(s)) {
                s.erase(t + 1, 1); //同理
            }
        }
    }
    cout << s ;
}

H

struct node {
    int x;
    bool flag;
} v[N];
// 根据题意模拟即可
il void solve()
{
    cin >> t;
    while (t--) {
        int p;
        int x = 0, y = 0;
        cin >> n >> p;
        for (int i = 1; i <= n; i++) {
            cin >> v[i].x;
            v[i].flag = true;
        }
        v[p].x++;
        if (v[p].x < 10) {
            cout << "0 0" << el;
            continue;
        }
        int i = p - 1, j = p + 1;
        int l = 1, r = 1;
        while (1) {
            if (i >= 1 && l) {
                v[i].x++;
                l--;
                if (v[i].x == 10) {
                    l++;
                    r++;
                    i--;
                }
            }
            else if (j <= n && r) {
                v[j].x++;
                r--;
                if (v[j].x == 10) {
                    l++;
                    r++;
                    j++;
                }
            } else
                break;
        }
        cout << l << ' ' << r << el;
    }
}

I

时间紧急,后续完善

pii a[N], b[N];

il void solve()
{
    cin >> t;
    while (t--) {
        cin >> n;
        cnt = 0;
        bool flag = true;
        for (int i = 1; i <= n; i++) {
            cin >> a[i].first;
            b[i] = a[i];
            b[i].second = i;
        }
        sort(b + 1, b + n + 1);
        for(int i = 1 ; i <= n; i++){
            a[b[i].second].second = i;
        }
        for (int i = 1; i <= (n + 1) / 2; i++) {
            if (b[i].first + b[n - i + 1].first != b[n].first + b[1].first)
                flag = false;
        }
        if (!flag) {
            cout << "NO" << '\n';
        } else {
            cout << "YES" << '\n';
            vector<pii> v;
            for(int i = 1 ; i <= n ; i++){
                while(a[i].second != i){
                    v.push_back({i, a[i].second});
                    swap(a[i], a[a[i].second]);
                }
            }
            cout << sz(v) << '\n';
            for(auto i : v){
                cout << i.first << ' ' << i.second << '\n';
            }
        }
    }
}
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子月二十七

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值