首页 > 其他分享 >牛客小白月赛71

牛客小白月赛71

时间:2023-04-25 13:22:11浏览次数:39  
标签:std cout int LL cin cat 牛客 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;
}

标签:std,cout,int,LL,cin,cat,牛客,71,小白月赛
From: https://www.cnblogs.com/XiongTingyang/p/17352307.html

相关文章

  • P2671 [NOIP2015 普及组] 求和
    here看到这个条件,想到等差数列,于是假设了1,3,5位置上的颜色一样时,总和是多少,然后发现是:(1+1+3+5)f(1)+(1+3+3+5)f(3)+(1+3+5+5)f(5)现在看的很清楚了,有两种可能:(i+配对的数之和+i)f(i)或者(i*配对的数的个数+配对的数之和)f(i)。看看样例1,发现后......
  • 【Oracle】year must be between -4713 and +9999,and not be 0
    【Oracle】yearmustbebetween-4713and+9999,andnotbe0yearmustbebetween-4713and+9999,andnotbe0出现问题的时候一般是to_date的地方有问题,很有可能是有字符串或者空格在数据中过滤掉就行......
  • 解决 Visual C++ 17.5 __cplusplus 始终为 199711L 的问题
    00.软件环境VisualStudio2022,VisualC++,Version17.5.401.问题描述在应用https://github.com/ToniLipponen/cpp-sqlite的过程中,发现源代码文件sqlite.hpp中,有一处宏,和本项目的C++LanguageStandard有关,如下图所示:将鼠标悬停在__cplusplus这个宏上,可以看到它......
  • 小白月赛71 补题
    C结束发现这题数据很水直接假做也能过1:比赛想到了利用log,可以用log(2e19)粗略判断然后再暴力#include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'#defineLLlonglong#definephpush_back#defineINF0x3f3f3f3f#definePIIpair<int,int>constdouble......
  • [牛客]链表的回文结构
    牛客链接思路:找中间结点从中间结点开始对后半段进行逆置比较前半段和后半段相等是,不相等不是只需将我们前面写过的链表中间结点,逆置链表的代码复用,并加上如下代码即可最终代码:/*structListNode{intval;structListNode*next;ListNode(intx):val(x),ne......
  • 【读书笔记】ISBN9787121353932
     【前言】是否所有人都可以公平地享受科技发展带来的生产力进步?AIGC应用越完善,内容生产的社会必要劳动时间就越少,人工就越没有价值。全社会新增劳动岗位的速度很快就会跟不上AIGC应用取代人工的速度,而不会使用AIGC应用的劳动者可能将无法获得收入、无法进行消费,从而逐步被剥离......
  • CF1714D 题解
    CF1714D题解description给定黑色文本\(t\)和\(n\)个字符串\(s_1,s_2...s_n\).一次操作可以将\(t\)中与\(s_i\)相等的子串涂成红色。一个位置多次涂色后仍是红色。\(s_i\)可以使用多次。求将\(t\)涂成红色的最小次数,并输出方案。无解输出-1.\(|t|\leq100\)......
  • 洛谷:P5716日份天数
    题目描述输入年份和月份,输出这一年的这一月有多少天。需要考虑闰年。输入格式输入两个正整数,分别表示年份\(y\)和月数\(m\),以空格隔开。输出格式输出一行一个正整数,表示这个月有多少天。样例#1样例输入#119268样例输出#131样例输入#220002样例输出#229......
  • 牛客练习赛110
    A.嘤嘤的签到双指针+算贡献用cnt[]来记录当前维护区间1和4的数量,当当前区间不满足要求则移动左指针直到满足要求,再加上贡献即可。当然也可以记录最后的1和4的位置,这样他们位置中较小的那一个的后一个位置就是能满足要求的区间的最左端的左指针,但是该方法就没上一个那么通用了......
  • CF1716D
    ChipMove-洛谷|计算机科学教育新生态(luogu.com.cn)背包DP:这道题与完全背包不一样的地方便是:至少要拿一个物品。DP[i,j]为前i个物品,每个至少拿一个,体积为j时的方案数转移方程:DP[i,j]=DP[i-1,j-w[i]]+DP[i,j-w[i]](具体见蓝书P277)然后用滚动数组优化空间复杂度由于是滚......