CodeForces Round 933 | Div3

在这里插入图片描述

🔥博客介绍`: 27dCnc

🎥系列专栏: <<数据结构与算法>> << 算法入门>> << C++项目>>

🎥 当前专栏: << 算法入门>>

专题 : 数据结构帮助小白快速入门算法
👍👍👍👍👍👍👍👍👍👍👍👍
☆*: .。. o(≧▽≦)o .。.:*☆

❤️感谢大家点赞👍收藏⭐评论✍️

在这里插入图片描述

学习目标:

今日学习打卡

  • ACM题解

学习时间:

  • 周一至周五晚上 7 点—晚上9点
  • 周六上午 9 点-上午 11 点
  • 周日下午 3 点-下午 6 点

学习内容:

在这里插入图片描述


内容详细:

A. Rudolf and the Ticket

题目考点: 语法基础

在这里插入图片描述

题目意思:
我们有俩数组, B[N] , C[N] 数组,俩数组分别表示,Rudolf 左右俩个口袋的硬币,然后Rudolf 去游乐园,游乐园售票机上只能支付小于 k 个硬币,问,Rudolf 有多少种支付方式使得, B[i] + C[i] <= k;

解题思路:
暴力枚举所有情况,统计符合情况的数量

#include <string>         // 字符串处理相关头文件
#include <vector>         // 向量容器头文件
#include <iostream>       // 输入输出流头文件
#define Run 1
#define endl "\n"
#define N 100005
#define FOR(i, j, k) for(int i(j); i <= (k); ++i)
#define ROF(i, j, k) for(int i(j); i >= (k); --i)
#define pii std::pair<int,int>
#define pll std::pair<ll, 1l>
#define ALL(v) (v).begin(),(v).end()
using namespace std;
using ll = long long;
 
 
 
class Solution {
public: 
    void solve() {
        int n, m, k; std::cin >> n >> m >> k;
        std::vector<ll>b(n + 10, 0);std::vector<ll>c(n + 10,0);
        for (int i = 0; i < n;i++) std::cin >> b[i];
        for (int i = 0; i < m; i++) std::cin >> c[i];
        ll ans = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (b[i] + c[j] <= k) ans++;
            }
        }
        std::cout << ans << endl;
    }
public: //最小公倍数
     int lcm(int a, int b)
    {
        return (a * b) / gcd(a, b);
    }
    //最大公约数
    int gcd(int a, int b) {
        return b > 0 ? gcd(b,a % b) : a;
    }
public:
    int IsPrime(int n)  //质数判断
    {
        int i;
        if(n<2||(n!=2&&n%2==0))//n小于2或者n是不等于2的偶数,必然非素数
            return 0;
        else//这里n都是奇数
        {//这里使用上面刚提到的写法,用i代替开根号的过程
            for(i=3;i*i<=n;i+=2)//这里注意循环条件
            {//2必然不是因子,从3开始,每次递增2,直到sqrt(n)为止
                if(n%i==0)
                    return 0;
            }
            return 1;
        }
    }
public: //快速幂
    int qmi(ll a, ll b, ll p) // 对 p 取模 a的b次幂
    {
       ll res = 1;
       while(b) 
       {
           if (b & 1) res = res * a % p;
           a = (a * a) % p,b >>= 1;
       }
       return res;
    }
public:
    int ShU(int n) {
        ll ans = 0;
        while(n) {
            ans += (n % 10);
            n /= 10;
        }
        return ans;
    }
};
 
signed main() {
    std::cin.tie(0) -> std::ios::sync_with_stdio(false);
    std::cout.tie(0) -> std::ios::sync_with_stdio(false);
    
#if Run
    int _;std::cin>>_;while(_-->0) Solution().solve();
#else
    Solution().solve();
#endif
    return 0;
}

B. Rudolf and 121

题目考点: 思维

在这里插入图片描述

题目意思

Rudolf有一个由 n 整数组成的数组 a,元素编号从 1 到 n。

在一个操作中,他可以选择索引 i i i ( 2 ≤ i ≤ n − 1 2 \le i \le n - 1 2in1) 并分配:

  • a i − 1 = a i − 1 − 1 a_{i - 1} = a_{i - 1} - 1 ai1=ai11
  • a i = a i − 2 a_i = a_i - 2 ai=ai2
  • a i + 1 = a i + 1 − 1 a_{i + 1} = a_{i + 1} - 1 ai+1=ai+11

Rudolf可以多次应用此操作。任何索引 i i i 都可以使用零次或多次。
他能用这个操作使数组的所有元素都等于零吗?

解题思路

根据数据关系可知道, 当我们将一个数组全变为0时

a [ i ] a[i] a[i] = = = a [ i − 1 ] a[i-1] a[i1] ∗ * 2 2 2
a [ i − 1 ] a[i-1] a[i1] = a [ i + 1 ] a[i+1] a[i+1]

题目难点: 该从哪里开始遍历?

应该从头开始想后遍历,然后对元素进行操作,不能通过关系直接确定否则会出现误判等情况

代码

#include<bits/stdc++.h>
#define Run 1
#define endl "\n"
#define N 100005
#define FOR(i, j, k) for(int i(j); i <= (k); ++i)
#define ROF(i, j, k) for(int i(j); i >= (k); --i)
#define pii std::pair<int,int>
#define pll std::pair<ll, 1l>
#define ALL(v) (v).begin(),(v).end()
using namespace std;
using ll = long long;

//模拟

class Solution {
public: 
    void solve() {
       int n; std::cin >> n;
       vector<ll>a(n + 10,0);
       for (int i = 1; i <= n; i++) {
        std::cin >> a[i]; //输入数据
       }
       for (int i = 2; i < n; i++) { //因为元素可以多次运用所以是 ++ 不是 += 3;
        a[i] -= a[i - 1] *2; //对当前元素进行操作
        a[i + 1] -= a[i - 1]; // 对前一个元素进行操作
        if (a[i] < 0 || a[i + 1] < 0) { 
            std::cout << "NO\n"; //不满足条件排除
            return ;
        }
        a[i - 1] = 0; //对操作元素操作
       }
       for (int i = 1; i <= n; i++) {
        if (a[i]) {
            std::cout << "NO\n"; //进行完操作检测是否合法
            return ;
        }
       }
       std::cout << "YES" << "\n";
    }
public: //最小公倍数
     int lcm(int a, int b)
    {
        return (a * b) / gcd(a, b);
    }
    //最大公约数
    int gcd(int a, int b) {
        return b > 0 ? gcd(b,a % b) : a;
    }
public:
    int IsPrime(int n)  //质数判断
    {
        int i;
        if(n<2||(n!=2&&n%2==0))//n小于2或者n是不等于2的偶数,必然非素数
            return 0;
        else//这里n都是奇数
        {//这里使用上面刚提到的写法,用i代替开根号的过程
            for(i=3;i*i<=n;i+=2)//这里注意循环条件
            {//2必然不是因子,从3开始,每次递增2,直到sqrt(n)为止
                if(n%i==0)
                    return 0;
            }
            return 1;
        }
    }
public: //快速幂
    int qmi(ll a, ll b, ll p) // 对 p 取模 a的b次幂
    {
       ll res = 1;
       while(b) 
       {
           if (b & 1) res = res * a % p;
           a = (a * a) % p,b >>= 1;
       }
       return res;
    }
public:
    int ShU(int n) {
        ll ans = 0;
        while(n) {
            ans += (n % 10);
            n /= 10;
        }
        return ans;
    }
};

signed main() {
    std::cin.tie(0) -> std::ios::sync_with_stdio(false);
    std::cout.tie(0) -> std::ios::sync_with_stdio(false);
    
#if Run
    int _;std::cin>>_;while(_-->0) Solution().solve();
#else
    Solution().solve();
#endif
    return 0;
}

C. Rudolf and the Ugly String

题目考点: 字符串 s.suber()

在这里插入图片描述

题目意思:
小白现在有一个长度为 n 白龙马,因为小白前辈天生运气与颜值逆天,在他的直觉下,发现构成白龙马的字符串,如果出现 mappie 的字符串,将会给 书山小友 带来霉运,于是白前辈找到了,宇宙最强的你,来协助他完成白龙马的美化,拯救书山小友

解题思路

用C++的函数,suber 来查找每个字符是否出现 mappie

易错点:
如果出现mapie 这个时候应该进行 减少操作,因为多进行了 + 的操作

代码

#include <string>         // 字符串处理相关头文件
#include <vector>         // 向量容器头文件
#include <iostream>       // 输入输出流头文件
#define Run 1
#define endl "\n"
#define N 100005
#define FOR(i, j, k) for(int i(j); i <= (k); ++i)
#define ROF(i, j, k) for(int i(j); i >= (k); --i)
#define pii std::pair<int,int>
#define pll std::pair<ll, 1l>
#define ALL(v) (v).begin(),(v).end()
using namespace std;
using ll = long long;



class Solution {
public: 
    void solve() {
        int n, m, k; std::cin >> n >> m >> k;
        std::vector<ll>b(n + 10, 0);std::vector<ll>c(n + 10,0);
        for (int i = 0; i < n;i++) std::cin >> b[i];
        for (int i = 0; i < m; i++) std::cin >> c[i];
        ll ans = 0;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (b[i] + c[j] <= k) ans++;
            }
        }
        std::cout << ans << endl;
    }
public: //最小公倍数
     int lcm(int a, int b)
    {
        return (a * b) / gcd(a, b);
    }
    //最大公约数
    int gcd(int a, int b) {
        return b > 0 ? gcd(b,a % b) : a;
    }
public:
    int IsPrime(int n)  //质数判断
    {
        int i;
        if(n<2||(n!=2&&n%2==0))//n小于2或者n是不等于2的偶数,必然非素数
            return 0;
        else//这里n都是奇数
        {//这里使用上面刚提到的写法,用i代替开根号的过程
            for(i=3;i*i<=n;i+=2)//这里注意循环条件
            {//2必然不是因子,从3开始,每次递增2,直到sqrt(n)为止
                if(n%i==0)
                    return 0;
            }
            return 1;
        }
    }
public: //快速幂
    int qmi(ll a, ll b, ll p) // 对 p 取模 a的b次幂
    {
       ll res = 1;
       while(b) 
       {
           if (b & 1) res = res * a % p;
           a = (a * a) % p,b >>= 1;
       }
       return res;
    }
public:
    int ShU(int n) {
        ll ans = 0;
        while(n) {
            ans += (n % 10);
            n /= 10;
        }
        return ans;
    }
};

signed main() {
    std::cin.tie(0) -> std::ios::sync_with_stdio(false);
    std::cout.tie(0) -> std::ios::sync_with_stdio(false);
    
#if Run
    int _;std::cin>>_;while(_-->0) Solution().solve();
#else
    Solution().solve();
#endif
    return 0;
}

ok只会前3题后序题目,以后补 😁(❁´◡`❁)


学习产出:

  • 技术笔记 2 遍
  • CSDN 技术博客 3 篇
  • 习的 vlog 视频 1 个

在这里插入图片描述

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值