牛客小白月赛71

yizhihongxing

A.猫猫与广告

题目:

image

分析:

只需考虑c * d的矩阵竖着摆和横着摆两种情况。本题提示了考虑两矩阵对应边平行的情况,实际上可以证明倘若能斜着放,那么一定可以横着放或竖着放,证明方式可已通过构造三角形来证明a* b的矩阵的长宽一定小于c * d矩阵的长宽。

code:

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    int a, b, c, d;
    cin >> a >> b >> c >> d;

    if (a > b) swap(a, b);
    if (c > d) swap(c, d);
    
    if ((a <= c && b <= d) || (a <= d && b <= c))
        cout << "YES";
    else
        cout << "NO";
    
    return 0;
}

B.猫猫与密信

题目:

image

分析:

由于只消失一个字符,因此可以对可能存在love的子串进行讨论:
①消失的不是字符i,则满足条件的子串有:lve,loe,lov
②消失的字符是i,则满足条件的子串只有:ove
所以从前往后枚举每一个字符,若其为i或者o则截取以其开头的长度为3的子串,看是否满足要求即可。

code:

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

int main()
{
    std::ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    
    string s;
    cin >> s;
    
    bool flag = false;
    for (int i = 0; i < s.size(); i ++)
    {
        if (s[i] == 'l')
        {
            string s2 = s.substr(i, 3);
            if (s2 == "lve" || s2 == "loe" || s2 == "lov")
            {
                flag = true;
                break;
            }
        }
        else if (s[i] == 'o')
        {
            string s2 = s.substr(i, 3);
            if (s2 == "ove")
            {
                flag = true;
                break;
            }
        }
    }
    
    if (flag)
        cout << "YES";
    else
        cout << "NO";
    
    return 0;
}

C.猫猫与数列

题目:

image

分析:

这题的难点在处理溢出的问题。处理方式有很多,比如用long double或者int_128,这里介绍取对数的技巧。由于log(x)单调递增,因此我们不妨对an取log,根据其log值来判断大小关系。不过这里要处理精度的问题,我们可以让an-1 * log(an-2)与log(2M)比,若an比2M都要大那自然大于M,否则我们再直接计算an并和M比较,这时就不用担心溢出的问题。

code:

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

typedef long long LL;
const double M = log(2e18);
const int N = 110;
LL a[N];

LL qmi(LL m, LL k)
{
    LL res = 1, t = m;
    
    while (k)
    {
        if (k & 1)
            res = res * t;
        t = t * t;
        k >>= 1;
    }
    
    return res;
}

int main()
{
    cin >> a[1] >> a[2];
    
    int n = 3;
    
    while(1)
    {
        if (a[n - 1] * log(a[n - 2]) > M)
        {
            n --;
            break;
        }
        else
        {
            a[n] = qmi(a[n - 2], a[n - 1]);
            if (a[n] > 1e18)
            {
                n --;
                break;
            }
            n ++;
        }
    }
    
    cout << n;
    
    return 0;
}

D.猫猫与主人

题目:

image

分析:

每个元素有两个维度的变量,考虑放到坐标系中去启发思考。
image
我们用三角形表示小猫,圆形表示主人,我们可以发现对于每一个小猫,满足条件的主人在其左上区域。因此我们不妨对小猫和主人按横坐标排序,然后维护每一个小猫左上区域内的满足条件的纵坐标值最大的主人。

code:

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

const int N = 2e5 + 5;
struct Node
{
    int a, b, idx;
}cat[N], p[N];
int ans[N];

bool cmp(Node A, Node B)
{
    if (A.a != B.a)
        return A.a < B.a;
    else if (A.b != B.b)
        return A.b < B.b;
    else
        return A.idx < B.idx;
}

int main()
{
    std::ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    
    int n, m;
    cin >> n >> m;
    
    for (int i = 0; i < n; i ++)
        cin >> cat[i].a;
    
    for (int i = 0; i < n; i ++)
    {
        cin >> cat[i].b;
        cat[i].idx = i;
    }
    
    for (int i = 0; i < m; i ++)
        cin >> p[i].b;

    for (int i = 0; i < m; i ++)
    {
        cin >> p[i].a;
        p[i].idx = i;
    }
    
    sort(cat, cat + n, cmp);
    sort(p, p + m, cmp);
    
    int Max = -0x3f3f3f3f;
    
    for (int i = 0, j = 0; i < n; i ++)
    {
        while (j < m && p[j].a <= cat[i].a)
        {
            Max = max(Max, p[j].b);
            j ++;
        }
        j --;
        if (Max >= cat[i].b)
        {
            ans[cat[i].idx] = Max;
        }
        else
            ans[cat[i].idx] = -1;
    }
    
    for (int i = 0; i < n; i ++)
        cout << ans[i] << " ";
    
    return 0;
}

E.猫猫与数学

题目:

image

分析:

①有解:
先考虑一般情况:由于两边都有c,因此需要转化一下。不妨设a > b,根据更相减损法得gcd(a + c, b + c) = gcd(a - b, b + c) ≠ 1。枚举a - b得所有非1因数设为x,根据x反解c,然后对所有c的解取个min即为答案。
特判a - b = 0,若a = 1则c取1,否则c取0
②无解:
显然当a - b = 1时无解。

code:

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

typedef long long LL;
LL a, b, ans = 1e16;

void check(LL x)
{   
    if (x == 1)
        return;
    if (b % x == 0)
        ans = min(ans, 0LL);
    else
        ans = min(ans, x - b % x);
}

int main()
{
    cin >> a >> b;
    
    if (a < b)
        swap(a, b);
    
    if (a - b == 1)
        cout << -1;
    else if (a == b)
    {
        if (a == 1)
            cout << 1;
        else 
            cout << 0;
    }
    else
    {
        LL d = a - b;
        LL M = sqrt(d) + 1;
        for (int i = 1; i <= M; i ++)
        {
            if (d % i == 0)
            {
                check(i);
                check(d / i);
            }
        }
        cout << ans;
    }
    
    return 0;
}

F.猫猫与宝石

题目:

image

分析:

推公式:
image

code:

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

typedef long long LL;
const int mod = 998244353, N = 2e5 + 5, M = (mod + 1) / 2;
LL a[N], b[N];

int main()
{
    std::ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    
    LL n, s = 0;
    cin >> n;
    
    a[0] = b[0] = 1;
    for (int i = 1; i <= n; i ++)
    {
        a[i] = a[i - 1] * 2 % mod;
        b[i] = b[i - 1] * M % mod;
    }
    
    for (int i = 1; i <= n; i ++)
    {
        int x;
        cin >> x;
        s = (s + x) % mod;
        
        cout << (((a[i - 1] + (a[i - 2] * (i - 1) % mod)) % mod) * s % mod) * b[i] % mod << " ";
    }
    
    return 0;
}

原文链接:https://www.cnblogs.com/XiongTingyang/p/17352307.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:牛客小白月赛71 - Python技术站

(0)
上一篇 2023年4月25日
下一篇 2023年4月25日

相关文章

  • 神经网络理论基础及Python实现详解

    下面是关于“神经网络理论基础及Python实现详解”的完整攻略。 1. 神经网络理论基础 神经网络是一种模拟人脑神经元之间相互连接的计算模型,它用来解决分类、回归、聚类等问题。神经网络由多个神经元组成,每个神经元接收多个输入,经过加和和激活函数的处理后,输出一个结果。神经网络的训练过程是通过反向传播算法来实现的,它可以根据训练数据来调整神经元之间的权重和偏置…

    python 2023年5月13日
    00
  • JavaScript数据结构之链表的实现

    JavaScript数据结构之链表的实现 什么是链表 链表是一种线性数据结构,其中的元素在内存中不连续地存储,每个元素通常由一个存储元素本身的节点和一个指向下一个元素的引用组成。相比较于数组,链表具有如下优缺点: 优点:动态地添加或删除元素时,无需移动其它元素。(数组则需要移动其它元素) 缺点:不能随机地访问某个元素,必须从头开始顺序遍历。(而数组可以通过索…

    数据结构 2023年5月17日
    00
  • DES加密解密算法之python实现版(图文并茂)

    下面是详细讲解“DES加密解密算法之Python实现版(图文并茂)”的完整攻略,包含两个示例说明。 DES加密解密算法简介 DES加密解密算法是一种对称密钥加密算法,它使用相同的密钥进行加密和解密。该算法使用64位密钥和64位数据块,将数据块分成16个子块,并对每个子块进行加密。DES算法已经被广泛使用,但是由于其密钥长度较短,易受到暴力破解攻击。 DES加…

    python 2023年5月14日
    00
  • C语言数据结构系列队列篇

    C语言数据结构系列队列篇攻略 简介 队列(Queue)是一种先进先出(First In First Out, FIFO)的线性数据结构,类似于排队买票的过程。本篇攻略将带您从以下三个方面深入浅出地了解C语言数据结构系列队列篇: 队列的特点; 队列的实现; 队列的应用。 队列的特点 队列有两个特殊的端点,队头(front)和队尾(rear)。队头指示队列的头部…

    数据结构 2023年5月17日
    00
  • C++ 数据结构二叉树(前序/中序/后序递归、非递归遍历)

    下面是关于C++二叉树数据结构的详细攻略。 什么是二叉树 二叉树是一种树形数据结构,每个节点最多有两个子节点:左节点和右节点。一个节点没有左节点或右节点则分别为左子树和右子树为空。 递归遍历二叉树 前序遍历 前序遍历是指对于一棵二叉树,在访问右子树之前,先访问根节点,然后访问左子树。 下面是C++递归遍历二叉树的前序遍历示例代码: template <…

    数据结构 2023年5月17日
    00
  • Python集成学习之Blending算法详解

    以下是关于“Python集成学习之Blending算法详解”的完整攻略: 简介 Blending算法是一种集成学习方法,它将多个基模型的预测结果进行加权平均,得到最终的预测结果。在本教程中,我们将介绍Blending算法的原理和实现方法,包括数据集划分、基模型训练、Blending模型训练等。 数据集划分 Blending算法需要将原始数据集划分为训练集和测…

    python 2023年5月14日
    00
  • 详解python数据结构之队列Queue

    详解Python数据结构之队列 (Queue) 在计算机科学中,队列(Queue)是一种数据结构,可以用于按顺序存储和访问元素。该数据结构遵循先进先出(FIFO)原则,人们可以从队列的前面插入元素,从队列的后面删除元素。Python内置了队列模块(queue),这个模块实现了多线程安全队列、同步机制及相关数据结构。Queue模块提供了三种队列类型: FIFO…

    数据结构 2023年5月17日
    00
  • Java数据结构之链表详解

    Java数据结构之链表详解 什么是链表? 链表是一种基本的动态数据结构,它的基本思想是利用指针将一些零散的内存块串联起来,形成一个逻辑上的整体。链表由一些称为节点的元素组成,每个节点保存两个部分:数据和指向下一个节点的指针。相比于数组这种静态数据结构,链表具有动态性,我们可以通过动态的增加或删除节点来改变链表的大小。 链表的分类 单向链表:每个节点只有一个指…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部