Acwing 第 81 场周赛题解

A-三元组

原题连接

签到题

每组给三个数,求有多少组的值大于等于2

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

int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr); 
    int n;
    std::cin >> n;
    int res = 0;
    for (int i = 0; i < n; i ++) {
        int a,b,c;
        std::cin >> a >> b >> c;
        res += (a + b + c >= 2);
    }

    std::cout << res << "\n";
    return 0;
}

B-等差数列

原题连接

题解

要满足第i项与第i+1项相差为k,我们可以从头枚举每一个数,把它当做一个不变的值,那么它左边的数就要依次的减去k,才能满足题目要求。同理,右边的数要依次加k。然后判断每个位置是否与我们假设的每位上的数相同,如果不同,则修改。当然,首先要找出修改次数最少的不变值a[i];

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

using i64 = long long;

int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr); 
    int n,m;
    std::cin >> n >> m;

    std::vector<int> a(n + 1);
    for (int i = 1; i <= n; i ++) {
        std::cin >> a[i];
    }
    int res = n;

    auto work = [&](int k,bool flag) {
        int res = 0;
        for (int i = 1; i <= n; i ++) {
            int b = a[k] + (i - k) * m;
            if (b <= 0) return n;//题目要求是正整数,所以为负数的话我们就不选择这个方案
            if (b != a[i]) {
                res ++;
                if (flag) {
                    if (b > a[i]) std::cout << "+ " << i << " " << b - a[i] << "\n";
                    else std::cout << "- " << i << " " << a[i] - b << "\n";
                }
            }
        }
        return res;
    };
    
    for (int i = 1; i <= n; i ++) {
        res = std::min(res,work(i,false));//找出最小的修改次数
    }
    std::cout << res << "\n";
    for (int i = 1; i <= n; i ++) {
        if (res == work(i,false)) {
            work(i,true);//修改
            break;
        }
    }
    return 0;
}


C-卡牌

原题连接

题解

1.png
如图,对于第i张卡牌,我们需要对它操作的次数是f(i - 1) + 1 + f(i - 1)。 f为操作次数。所以,我们只需要预处理这样一个f数组,对于每一张蓝底,我们只需要执行1 + f(i - 1)次操作。

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

using i64 = long long;

int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr); 
    int n;
    std::cin >> n;

    string s;
    std::cin >> s;

    std::vector<i64> f(n + 1);//由于越往后边数越大,所以需要开longlong

    for (int i = 1; i <= n; i ++) {
        f[i] = f[i - 1] * 2 + 1;
    }

    i64 res = 0;
    for (int i = 1; i <= n; i ++) {
        if (s[i - 1] == 'B') {
            res += 1 + f[i - 1];
        }
    }

    std::cout << res << "\n";
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值