栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【Educational Codeforces Round 130 (Rated for Div. 2)】【题解A-C】

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Educational Codeforces Round 130 (Rated for Div. 2)】【题解A-C】

2022年6月13日16:25:17

文章目录
  • 2022年6月13日16:25:17
  • A. Parkway Walk
    • 题目大意:
    • 题解:
  • B. Promo
    • 题目大意:
    • 题解:
  • C. awoo's Favorite Problem
    • 题目大意:
    • 题解:

A. Parkway Walk 题目大意:

你正在穿过你家附近的公园大道。公园路有 n+1 个长椅,从左到右从 1 到 n+1 编号。长凳 i 和 i+1 之间的距离是 ai 米。

最初,你有 m 个单位的能量。要走 1 米的距离,您需要消耗 1 个单位的能量。如果你没有精力,你就不能走路。此外,您可以坐在长凳上恢复能量(这是恢复能量的唯一方法)。当你坐着时,你可以恢复任何你想要的整数能量(如果你坐得更久,你会恢复更多的能量)。请注意,您的能量可以超过 m。

你的任务是找到你必须恢复的最小能量(通过坐在长凳上)从长凳 1 到达长凳 n+1(并结束你的步行)。

你必须回答 t 个独立的测试用例。

输入
输入的第一行包含一个整数 t (1≤t≤100) — 测试用例的数量。然后是 t 个测试用例。

测试用例的第一行包含两个整数 n 和 m(1≤n≤100;1≤m≤10^4)。

测试用例的第二行包含 n 个整数 a1,a2,…,an (1≤ai≤100),其中 ai 是长凳 i 和 i+1 之间的距离。

输出
对于每个测试用例,打印一个整数——在相应的测试用例中,从长凳 1 到达长凳 n+1(并结束步行)所需恢复的最小能量(通过坐在长凳上)。

inputCopy
3
3 1
1 2 1
4 5
3 3 5 2
5 16
1 2 3 4 5
outputCopy
3
8
0

题解:

对距离求和,减去初始值,即得到答案。

void solve(){
    int n, k;
    cin >> n >> k;
    ll sum = 0;
    for (int i = 0; i < n;i++){
        int x;
        cin>>x;
        sum += x;
    }
    cout << max(sum - k,0ll) << nl;
}
B. Promo 题目大意:

商店出售 n 件商品,第 i 件商品的价格为 pi。商店管理层将举行促销活动:如果顾客至少购买 x 件商品,则其中最便宜的 y 件是免费的。

管理层尚未决定 x 和 y 的确切值。因此,他们要求您处理 q 个查询:对于给定的 x 和 y 值,如果客户进行一次购买,则确定免费收到的物品的最大总价值。

请注意,所有查询都是独立的;它们不会影响商店的库存。

输入
第一行包含两个整数 n 和 q (1≤n,q≤2⋅10^5)——分别是商店中的商品数量和查询次数。

第二行包含 n 个整数 p1,p2,…,pn (1≤pi≤10^6),其中 pi — 第 i 件商品的价格。

以下 q 行分别包含两个整数 xi 和 yi (1≤yi≤xi≤n) — 第 i 个查询中参数 x 和 y 的值。

输出
对于每个查询,打印一个整数——一次购买免费收到的物品的最大总价值。

inputCopy
5 3
5 3 1 5 2
3 2
1 1
5 3
outputCopy
8
5
6
题解:

贪心:排序后取最大的 xi 件衣服中偏小的 yi 件的价值和。

注意暴力会超时,选择前缀和O(1)的时间解决问题。

不开 long long 毁一生

void solve(){
    int n, q;
    cin >> n >> q;
    int p[n+1] = {0};
    for (int i = 0; i < n;i++)
        cin >> p[i];
    sort(p, p + n);
    //超时
    // while(q--){
    //     int a, b;
    //     cin >> a >> b;
    //     int sum = 0;
    //     for (int i = n - a; i < n - a + b; i++)
    //         sum += p[i];
    //     cout << sum << nl;
    // }
    ll sum[n + 1] = {0};
    sum[1] = p[0];
    for (int i = 2; i <= n;i++)
        sum[i] = sum[i - 1] + p[i - 1];
    while(q--){
        int a, b;
        cin >> a >> b;
        cout << sum[n - a + b] - sum[n - a] << nl;
    }
}
C. awoo’s Favorite Problem 题目大意:

给定两个长度为 n 的字符串 s 和 t。两个字符串中的每个字符都是“a”、“b”或“c”。

在一个动作中,您可以执行以下操作之一:

选择 s 中出现的“ab”并将其替换为“ba”;
选择 s 中出现的“bc”并将其替换为“cb”。
您可以执行任意数量的移动(可能为零)。你能改变字符串 s 使它等于字符串 t 吗?

输入
第一行包含一个整数 q (1≤q≤10^4)——测试用例的数量。

每个测试用例的第一行包含一个整数 n (1≤n≤10^5)——字符串 s 和 t 的长度。

第二行包含长度为 n 的字符串 s。每个字符是“a”、“b”或“c”。

第三行包含长度为 n 的字符串 t。每个字符是“a”、“b”或“c”。

所有测试用例的 n 总和不超过 10^5。

输出
对于每个测试用例,如果您可以通过执行任意数量的移动(可能为零)来更改字符串 s 以使其等于字符串 t,则打印“YES”。否则,打印“否”。

inputCopy
5
3
cab
cab
1
a
b
6
abbabc
bbaacb
10
bcaabababc
cbbababaac
2
ba
ab
outputCopy
YES
NO
YES
YES
NO
题解:

字符串处理,按照题意的处理方式进行分类讨论,具体见代码:

bool check(string &a,int i,int n,char b,char c){
    if(i + 1 >= n)
        return 0;
    for (int j = i + 1; j < n; ++j) {
        if(a[j] == b)
            continue;
        else if(a[j] == c) {
            swap(a[i], a[j]);
            return 1;
        } else {
            return 0;
        }
    }
}
void solve(){
    int n;
    string a, b;
    cin >> n >> a >> b;
    bool flag = 1;
    for (int i = 0; i < n && flag; ++i) {
        if(a[i] != b[i]) {
            if(a[i] == 'b' && b[i] == 'c') 
                flag = check(a, i, n,'b','c');
            else if(a[i] == 'a' && b[i] == 'b') 
                flag = check(a, i, n,'a','b');
            else 
                flag = 0;
        }
    }
    if(a != b)
        flag = 0;
    if(flag)
        cout << "yes" << nl;
    else
        cout << "no" << nl;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/968472.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号