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

牛客小白月赛79

时间:2023-10-21 15:23:54浏览次数:38  
标签:... int res ll long 牛客 小白月赛 using 79

牛客小白月赛79

A. 数位dp?

解题思路:

如果开始就是偶数,那么直接不用变化。

如果开始不是偶数,那么个位数位上的数字一定不是偶数。换句话讲,只有个位数位上为偶数时,该数字才是偶数。

所以,一直闪末尾数位,直到该数位为偶数或者删完为止。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
#define fi first
#define se second

void solve()
{
    int x;
    cin >> x;
    if (x & 1)
    {
        int res = x;
        vector<int> v;
        while (res)
        {
            v.push_back(res % 10);
            res /= 10;
        }
        int suf = v.size();
        // cout << suf << endl;
        for (int i = 0; i < v.size(); i++)
        {
            // cout << i << ' ' << v[i] << endl;
            if (v[i] & 1)
            {
                continue;
            }
            suf = i;
            break;
        }
        cout << suf << endl;
    }
    else
    {
        puts("0");
    }
}

int main()
{
    int t = 1;
    while (t--)
    {
        solve();
    }
    return 0;
}

B. 灵异背包?

解题思路:

奇数加奇数等于偶数,偶数加偶数等于偶数。

将所有数累加起来,记录奇数的个数和奇数的最小数。如果奇数有奇数个,那么减去一个最小的奇数。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
#define fi first
#define se second

void solve()
{
    int n;
    cin >> n;
    vector<int> v;
    ll ans = 0;
    int minv = 1e9 + 10;
    int cnt = 0;
    for (int i = 1; i <= n; i++)
    {
        int x;
        cin >> x;
        if (x & 1)
        {
            minv = min(minv, x);
            cnt++;
        }
        ans += x;
    }
    if (cnt & 1)
    {
        ans -= minv;
    }
    cout << ans;
}

int main()
{
    int t = 1;
    while (t--)
    {
        solve();
    }
    return 0;
}

C. mex和gcd的乘积

解题思路:

如果\(mex = 0\),那么\(mex * gcd = 0\)。

如果\(mex = 1\),那么这段连续序列一定是沿着\(0\)向左右展开且其中不包含\(1\)。此时,随着展开长度的增加\(gcd\)只有可能变小,不会变大。所以此时\(mex * gcd\)的最大值就在\(0\)的左边或者右边。

如果\(mex \geq 2\),此时\(gcd = 1\).此时我们选取整个序列\(gcd\)不会变得更小,\(mex\)会取得最大。

注意:\(gcd(0,0) = 0\)。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
#define fi first
#define se second

ll gcd(ll a, ll b)
{
    return b ? gcd(b, a % b) : a;
}
void solve()
{
    int n;
    cin >> n;
    vector<ll> v(n + 1);
    vector<bool> st(n + 1);
    vector<int> pos;
    ll ans = 0;
    ll g = 0;
    for (int i = 1; i <= n; i++)
    {
        cin >> v[i];
        st[v[i]] = true;
        if (v[i] == 0)
        {
            pos.push_back(i);
        }
        g = gcd(g, v[i]);
    }
    ll amex = 0;
    while (st[amex])
    {
        amex++;
    }
    if (amex == 0 || g == 0)
    {
        puts("0");
        return;
    }
    ans = max(ans, amex);
    for (auto idx : pos)
    {
        if ((idx - 1 >= 1 && idx - 1 <= n))
        {
            ans = max(ans, v[idx - 1]);
        }
        if ((idx + 1 >= 1 && idx + 1 <= n))
        {
            ans = max(ans, v[idx + 1]);
        }
    }
    cout << ans;
}

int main()
{
    int t = 1;
    while (t--)
    {
        solve();
    }
    return 0;
}

D. 2^20

解题思路:

两种操作花费都为\(1\):

操作一:加一。

操作二:乘二。

我们要用最少的花费将\(x\)变为\(2^{20}\)的倍数。

\(2^{20}\)的倍数等价于二进制表示最后20个数位都是0.

操作二等价于将二进制右移末尾补零。所以任何数最多进行20次操作二一定能得到\(2^{20}\)的倍数。

我们可以先全部进行操作二,用\(cnt\)记录这个花费上限。

加法可能一次性让末尾多出多个零(基于末尾有多个1的情况下),所以我们的操作一定是先加后乘。我们用之前记录的操作上限,枚举先加的次数,对答案进行更新。

时间复杂度:\(O(400T)\)

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
#define fi first
#define se second

ll qmi(ll a, ll b)
{
    ll res = 1;
    while (b)
    {
        if (b & 1)
        {
            res = res * a;
        }
        a = a * a;
        b >>= 1;
    }
    return res;
}

void solve()
{
    ll bas = qmi(2, 20);
    ll n;
    cin >> n;
    ll t = n;
    int cnt = 0;
    ll ans = 0;
    while (t % bas)
    {
        t <<= 1;
        cnt++;
    }
    ans = cnt;
    for (int i = 0; i <= cnt; i++)
    {
        t = n;
        t += i;
        int m = cnt - i;
        ll num = i;
        while (m--)
        {
            if (t % bas == 0)
            {
                ans = min(ans, num);
                break;
            }
            t <<= 1;
            num++;
        }
    }
    cout << ans << endl;
}

int main()
{
    std::ios::sync_with_stdio(0);
    std::cin.tie(0);
    std::cout.tie(0);
    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}

E. 重生之我是QQ邮箱

解题思路:

我们每次输入密码正确的概率为\(p\)。

只有\(7\)个位置的字符需要正确性判断,每个位置输入正确的概率为\(\frac{1}{6}\),所以,\(p = \frac{1}{6^7}\)。

每次输错了就要重新输入,直到输入正确位置,这是几何概型,期望为\(\frac{1}{p} = 6^7\)。

此时,我们就能得到没用道具前的期望时间,其个位数位为\(res = 6^7 \% 10\)。接下来我们要对其进行\(m\)次平方操作,得到最终的末尾值。

这里,我们发现这个最终数应当是\((6^7)^{2^m}\)的个位数位上的数字。但这里的数很大,无法直接运算。快速幂的运算性质也无法在过程中进行保留运算啥的。

这里通过观察,我们能发现一个性质,就是个位数的平方总会陷入一个无限循环。

\(0 \to 0 \to ...\)

\(1 \to 1 \to 1 \to ...\)

\(2 \to 4 \to 6 \to 6 \to ...\)

\(3 \to 9 \to 1 \to 1\to ...\)

\(4 \to 6 \to 6 \to ...\)

\(5 \to 5 \to ...\)

\(6 \to 6 \to ...\)

\(7 \to 9 \to 1\to 1\to ...\)

\(8 \to 4 \to 6 \to 6 \to ...\)

\(9 \to 1\to 1\to ...\)

所以直接暴力运算,当一个数出现第二次时,就是答案。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
#define fi first
#define se second

ll qmi(ll a, ll b)
{
    ll res = 1;
    while (b)
    {
        if (b & 1)
        {
            res = res * a;
        }
        a = a * a;
        b >>= 1;
    }
    return res;
}

void solve()
{
    ll bas = qmi(6, 7);
    ll n, m;
    cin >> n >> m;
    if (n < 7)
    {
        cout << -1 << endl;
        return;
    }
    ll res = n * bas;
    ll ans = res % 10;
    vector<int> cnt(11);
    for (int i = 1; i <= m; i++)
    {
        ans = ans * ans;
        cnt[ans % 10]++;
        if (cnt[ans % 10] == 2)
        {
            cout << ans % 10 << endl;
            return;
        }
    }
    cout << ans % 10 << endl;
}

int main()
{
    std::ios::sync_with_stdio(0);
    std::cin.tie(0);
    std::cout.tie(0);
    int t = 1;
    while (t--)
    {
        solve();
    }
    return 0;
}

标签:...,int,res,ll,long,牛客,小白月赛,using,79
From: https://www.cnblogs.com/value0/p/17779009.html

相关文章

  • 14代酷睿i9/i7选它挺好!微星MPG B760M EDGE TI WIFI 刀锋 钛 主板评测:仅1399元 降压能
    一、前言:能满足绝大多数玩家需求的B760M主板如果是以前,我们会推荐顶级的Z790主板来搭配酷睿14代i9和i7的K系列处理器,但在测试了这块微星MPGB760MEDGETIWIFI主板之后,我们改变了原先的看法。这是因为这块1399元的B760主板,不论是降压能力还是内存支持,都完全不输给5000元级的......
  • 79基于java的在线家政预约服务系统设计与实现(配套lun文,可参考做bi设)
    本章节给大家带来一个基于java在线家政预约服务系统设计与实现,可适用于java家政服务系统,java预约家政系统,java在线家政系统,在线服务系统,社会家政系统,家政管理系统,家政服务平台,家政更加服务平台系统,家政管理系统等等;项目背景现代社会,由于经济不断发展,家政服务的数量也在不断的......
  • 《看了受制了》第四十五天,5道题合计279道题
    2023年10月19日Acwing1978奶牛过马路题目理解这个题目和友好城市太像了,那个是排序一下求最长上升子序列,这个排序一下要达到:\(P_i\)前面的每一个数都要小于它\(P_i\)后面的每一个数都要大于它所以我们要在\(O(n)\)的复杂度内处理完需要,搞个前缀最大值和前缀最小值代码实......
  • P7974 题解
    解题思路首先可以确保每一次列的方向一定不会与\(s\)到\(t\)的方向相反。不妨设\(l=\min\{s,t\}\),\(r=\max\{s,t\}\)。对于每次移动,所花体力值如下:显然,从\(l\)到\(r\),一定要翻过\([l,r]\)间最高的一个,区间最大我们毫不犹豫地选择ST表,然后我们思考一下,令\(h_x=\m......
  • 疯狂堆料!技嘉钛雕Z790 AORUS PRO X主板图赏
    技嘉推出了钛雕Z790AORUSPROX主板。现在这款新品已经来到了我们评测室,下面为大家带来图赏。技嘉钛雕Z790AORUSPROX主板采用新一代超耐久显卡插槽,约58KG承重能力、内衬保护显卡PCB。其采用18+1+2相供电设计,4根双通道DDR5内存插槽,支持DDR5超频,支持XMP至8266+频率。装甲快易......
  • [题解] CF1790E - XOR Tree
    CF1790E-XORTree题意给定一颗无根树,在可以改变任意一个点的点权操作基础上,让树上任意简单路径的异或和不为\(0\),问最少需要多少次操作。思路假设某个点为根,设\(pre_x\)为\(x\)点到根的树上前缀异或和,\(a_x\)为\(x\)的点权,则\(x\)和\(y\)之间简单路径的异或和......
  • 铭凡推出UM760 Pro/790 Pro迷你主机:顶配锐龙9 7940HS
    铭凡推出了UM760Pro与790Pro迷你主机,售价2299元起。据介绍,铭凡UM790Pro搭载锐龙97940HS处理器,采用4nm工艺打造,Zen4CPU架构、RDNA3GPU架构、16MB三级缓存、8核心16线程、5.2GHz加速频率、Radeon780M12单元核显。而铭凡760Pro则搭载锐龙57640HS处理器,同样为Zen4CPU架......
  • 数据库SQL实战|牛客网(查找入职员工时间排名倒数第三的员工所有信息)
    描述有一个员工employees表简况如下: 请你查找employees里入职员工时间排名倒数第三的员工所有信息,以上例子输出如下:输出:10005|1955-01-21|Kyoichi|Maliniak|M|1989-09-12droptableifexists`employees`;CREATETABLE`employees`(`emp_no`int(11)NOTNULL,`bir......
  • CF1879F Last Man Standing 题解
    原题翻译观察题目,容易发现当题目难度为\(x\)时一个OIer存活时间为\(h_i\lceil\frac{a_i}{x}\rceil\)发现\(a_i\)较小,所以我们先考虑暴力枚举\(x\in[1,\maxa_i]\),然后把原数组按\(a_i\)排个序,对于每组\(\lceil\frac{a_i}{x}\rceil\)相同的部分统一计算他......
  • 微星Z790 MAX主板发布:支持英特尔第14代酷睿处理器及最高Wi-Fi 7标准
    英特尔酷睿第14代处理器正式发布,MSI微星科技也为此带来了新一代系列主板产品——MSIZ790MAX。新一代主板产品又细分为了MEG系列,MPG系列,MAG系列和PRO系列。据悉,英特尔酷睿第14代处理器基于其“英特尔7”混合架构工艺技术构建,但在英特尔酷睿第14代处理器上,得益于英特尔的TVB技术......