牛客小白月赛71

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实现最短路径算法的完整攻略 最短路径算法是一种常用的图论算法,用于在图中查找两个节点之间的最短路径。本文将详细讲解Python实现最短路径算法的整攻略,包括算法原理、实现过程和示例。 算法原理 最短路径算法的基本思想是通过遍历图中的节点,计算每个节点到起点的距离,并记录最短距离。在遍历过程,如果发现某个节点到起点的距离更短,则更新该节点的距离。最…

    python 2023年5月14日
    00
  • Python最长公共子串算法实例

    下面是详细讲解“Python最长公共子串算法实例”的完整攻略,包括算法原理、Python实现和两个示例说明。 算法原理 最长公共子串算法是一种用于查找两个字符串中最长公共子串的算法。其主要思想是将两个字符串分别以行和列的形式,然后查找它们的交叉点,找到最长的交叉点序列,即为最长公共子串。最长公共子串算法的实现过程如下: 构建一个二维数组,用于存储两个字符串中…

    python 2023年5月14日
    00
  • Java数据结构之图的两种搜索算法详解

    Java数据结构之图的两种搜索算法详解 引言 图是现实世界中最为普遍的现象之一,因此对于图的分析和操作是计算机科学和工程中最为重要的问题之一。在本文中,我们将对图结构的两种搜索算法进行详细讨论和研究,这些算法是图论研究的基本工具。 图的定义 在计算机科学和数学领域中,图是由若干个节点(或称为顶点)和它们之间的边组成的一种数据结构。 图的两种搜索算法 图的搜索…

    数据结构 2023年5月17日
    00
  • Python中的函数式编程:不可变的数据结构

    Python是一门支持函数式编程的语言。相比于传统的命令式编程,函数式编程更加强调数据的不可变性。本文将介绍如何在Python中使用不可变的数据结构实现函数式编程。 什么是不可变的数据结构? 不可变数据结构是指一旦创建就无法改变的数据结构。在Python中,元组(tuple)是一个典型的不可变数据结构。以下是一个创建元组的示例代码: a_tuple = (1…

    数据结构 2023年5月17日
    00
  • 一、对系统理论的认识

           经过一周的时间学习,我们知道了系统的定义:是一个由一组相互连接的要素构成的,能够实现某个目标的整体,任何一个系统都包括三种构成要件:要素连接,功能或目标。       1.系统的连接使得系统呈现特定的结构,使得系统的各个部件连接而产生系统特有的功能—相关性导新功能涌现。连接的媒介—“三流”(信息流,能量流,物质流)。       2.系统的静态…

    算法与数据结构 2023年4月18日
    00
  • 神经网络理论基础及Python实现详解

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

    python 2023年5月13日
    00
  • 莫比乌斯反演,欧拉反演学习笔记

    (未更完) 我算法中也就差点数论没学了,这几周卷了,学了一下,分享一下啊。 我会讲得详细一点,关于我不懂得地方,让新手更容易理解。 学习反演有很多定义啥的必须要记的,学的时候容易崩溃,所以希望大家能坚持下来。   第一个定义: $\lfloor x\rfloor$:意思是小于等于 $x$ 的最大整数。 数论分块 学习反演之前,要先学习一些边角料,先来看数论分…

    算法与数据结构 2023年4月17日
    00
  • python语言中有算法吗

    Python语言本身并没有算法,但是Python作为一种高级编程语言,提供了丰富的数据结构和算法库,可以方便地实现各种算法。在本攻略中,我们将介绍Python中常用的算法库和数据结构,并提供两个示例说明。 Python中常用的算法库和数据结构 算法库 Python中常用的算法库包括: NumPy:用于数值计算和科学计算的库,包括矩阵运算、线性代数、傅里叶变换…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部