牛客小白月赛73

news2024/11/29 8:47:13

A:最小的数字

A-最小的数字_牛客小白月赛73 (nowcoder.com)

#include<bits/stdc++.h>
#define endl '\n'
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define int long long
using namespace std;
int n, m, k, A, B, N, M, K;
const int maxn = 1e6 + 10;
signed main()
{
    int t;
    cin >> t;
    for (int i = t; 1; i++)
        if (i % 3 == 0) return cout << i, 0;
    return 0;
}

B:优美的GCD 

B-优美的GCD_牛客小白月赛73 (nowcoder.com)

#include<bits/stdc++.h>
#define endl '\n'
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define int long long
using namespace std;
int n, m, k, A, B, N, M, K;
const int maxn = 1e6 + 10;
void solve(){
    cin >> n;
    cout << n * 2 << " " << n << endl;
}
signed main()
{
    int t;
    cin >> t;
    while(t--)
        solve();
    return 0;
}

C:优美的序列

C-优美的序列_牛客小白月赛73 (nowcoder.com)

思维:其实
对于任意的 1≤i,j≤n1\leq i,j\leq n1≤i,j≤n,满足 ∣ai−aj∣≥∣i−j∣|a_i-a_j|\geq |i-j|∣ai​−aj​∣≥∣i−j∣。

只用满足n个不同的数字对其简单排序就可以了(大到小,或者小到大都可以)

干脆直接用一个set<int>来维护就可以了

#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
int n, m, k, A, B, N, M, K;
const int maxn = 1e6 + 10;
void sove()
{
    set<int>s;
    bool is = false;
    cin >> n;
    while (n--)
    {
        cin >> m;
        if (s.find(m) != s.end())is = true;
        s.insert(m);
    }
    if (is) printf("-1\n");
    else
        for (auto i : s)
            printf("%d\n", i);
}

int main()
{
    cin.tie(0)->sync_with_stdio(false);
    int t;
    cin >> t;
    while (t--)
        sove();
    return 0;
}

 D-Kevin喜欢零(简单版本) 

D-Kevin喜欢零(简单版本)_牛客小白月赛73 (nowcoder.com)

 E-Kevin喜欢零(困难版本)_牛客小白月赛73 (nowcoder.com)

 DE不同点只在于数据不同,简单的说能过E就可以过D,这边直接用E的解了

#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
const int maxn = 2e5 + 10;
int s2[maxn],s5[maxn];//存放第i个数分别有多少个2和5的因子
int n, m, k, t;
void solve()
{
    for(int i = 0;i <= n; i++)s2[i] = s5[i] = 0;
    cin >> n >> k;
    for(int i = 1;i <= n;i++)
    {
        s2[i] = s2[i - 1];
        s5[i] = s5[i - 1];
        cin >> m;
        for(int j = m;j % 2 == 0; j /= 2)s2[i]++;
        for(int j = m;j % 5 == 0; j /= 5)s5[i]++;
    }
    long long ans = 0;
    for(int i = 1;i <= n;i++)
    {
        int p2 = s2[i - 1] + k;
        int p5 = s5[i - 1] + k;
        int l2 = lower_bound(s2,s2 + n + 1, p2) - s2;
        int r2 = upper_bound(s2,s2 + n + 1, p2) - s2;
        int l5 = lower_bound(s5,s5 + n + 1, p5) - s5;
        int r5 = upper_bound(s5,s5 + n + 1, p5) - s5;
        int r = max(r2,r5), l = max(l2,l5);
        l = max(i,l);
        ans += r - l;
    }
    cout << ans << endl;
}
int main()
{
    cin.tie(0) -> sync_with_stdio(false);
    cin >> t;
    while(t--)
        solve();
    return 0;
}

核心代码 

二分搜索范围到s + n + 1(+1的原因是因为第0个位置不是我们用于记数组因数,有效下标范围为[1,n])

 long long ans = 0;
    for(int i = 1;i <= n;i++)
    {
        int p2 = s2[i - 1] + k;
        int p5 = s5[i - 1] + k;
        int l2 = lower_bound(s2,s2 + n + 1, p2) - s2;
        int r2 = upper_bound(s2,s2 + n + 1, p2) - s2;
        int l5 = lower_bound(s5,s5 + n + 1, p5) - s5;
        int r5 = upper_bound(s5,s5 + n + 1, p5) - s5;
        int r = max(r2,r5), l = max(l2,l5);
        l = max(i,l);
        ans += r - l;
    }
    cout << ans << endl;

解释: 

对末尾有K个0可以转换成这个数是X * 10^K(其中X % 10 != 0)

例如:800 = 8 * 10 ^ 2

再看10 = 2 ^ 1 * 5 ^ 1

800 = 5 ^ 2 * 2 ^ 5 

1000 = 5 ^ 3 * 2 ^ 3

即:对于任意一个末尾有K个0的数都可以转换成X * 10^K 的形式

而任意 X * 10^K 形式的数都可以转换成 5 ^ N * 2 ^ M

其中 min(N , M) == K

这样就把问题转换成从1号位置开始枚举到n号位置

找到有一个区间使得min(s2[i],s5[i]) == K

但是注意由于我们对于每一个s2 和 s5 的因子个数都继承了它上一个数的因子个数

因此在实际代码中对于查找的因子个数应该是 s[i - 1] + K;

例如: 125 8 1 1

下标   1   2  3  4

 对于s5[3]而言它的因子5完全由s5[2]继承而来

这里顺便例举s2的值  s2[1] = 0  s2[2] == s2[3] == s2[3] == 3

在枚举1号位置的时候125 s5[1] == 3

第一个合法位置由s5[2]开始 此时 min(s5[2],s2[2] ) == 3

结束位置为4

第一轮得到的子序列数为 4 - 1 == 3;

但是注意到第二轮枚举时

由于s5[2]的5完全由s5[1]继承而来,所以事实上s2[2]在合法范围为[2,n]时已经没有125的支撑,

如果要使得区间[2,n]依旧实际满足存在有3个为5的因子应该要满足在去掉s5[1]的前提下依旧有3个为5的因子 即 == >> " s2[2] - s2[1] == 3 "   == >>  s2[2] == s2[1]  + K

推出对于每一轮我们二分查找s2和s5对应的目标值p2和p5应该是s2[i - 1] + K  和 s5[i - 1] + K

== >> p2 = s2[i - 1] + K 

== >> p5 = s5[i - 1] + K

其中区间长度(上界 - 下界)就为连续子段个数

但是要注意对于左边界不能小于当前枚举的位置i,因此我们用l = max(l,i)来维护枚举范围的合法性

 F-Kevin的哈希构造_牛客小白月赛73 (nowcoder.com)

省流:这题不会-_-||

G-MoonLight的冒泡排序难题_牛客小白月赛73 (nowcoder.com)

分析一下:对于冒泡排序,每一轮从未排序的元素中确定一个最大值将其排到未排序序列中的最后一个位置

再分析一下答案的组成

一:求出长度为n的数组的所有可能排列,以及每一个排列所需要的操作轮数

二:根据排列可能和每一个排列所需要的操作轮数求出长度为n的数组完成排序的期望操作数

三:求出期望值E = p / q;

四:根据期望值代入公式得到最终结果公式:p * q^(mod - 2) % mod;

先看一:

对于一个数是否需要满足pi != i,就是判断这个数pi是否满足它在排序前和排序后位置保持不变

如果满足说明在他后面的数都比他大或者说pi是在未排序序列中最大的值,也就是只要pi != i,那么pi就至少需要就行排序一次

对于二,三推出期望值的规律如下

最后可以得到一个期望公式 ans(n) = 1 / 2 + 2 / 3 + …… + n - 1 / n  

最后四:

根据得到的ans(n)代入公式: p * q^(mod - 2) % mod;

由于mod的值很大,常规pow求值会爆,通过快速幂求值的方式每次得到的结果 % mod后返回最终结果得到答案,

代码如下:

#include<bits/stdc++.h>
using namespace std;
using namespace std;
#define endl '\n'
#define int long long
const int mod = 998244353, maxn = 2e5 + 10;
int n, m, k, N, M, K, A, B;
vector<int>ans(maxn);
int mypow(int a, int n)
{
    int ans = 1;
    while (n)
    {
        if (n & 1)
        {
            n -= 1;
            ans = ans * a % mod;
        }
        else
        {
            n /= 2;
            a = a * a % mod;
        }
    }
    return ans;
}

void Init()
{
    for (int i = 1; i <= maxn; i++)
        ans[i] = (ans[i - 1] + (i - 1) * mypow(i, mod - 2) ) % mod;
}

void solve()
{
    cin >> n;
    cout << ans[n] << endl;
}
signed main()
{
    cin.tie(0)->sync_with_stdio(false);
    Init();
    int t;
    cin >> t;
    while (t--)
        solve();
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/576463.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

22种transforms数据预处理方法

来源&#xff1a;投稿 作者&#xff1a;阿克西 编辑&#xff1a;学姐 建议搭配视频学习↓ 视频链接&#xff1a;https://ai.deepshare.net/detail/p_5df0ad9a09d37_qYqVmt85/6 1.数据增强&#xff08;data augmentation&#xff09; 数据增强又称为数据增广&#xff0c;数据…

docker安装单机nacos、rocketmq、reids、xxl-job、minio、elasticsearch、kibana、gogs、nginx

目录在右侧中部 启动容器报错 直接删除那个name后边的就可以 安装nacos 首先需要拉取对应的镜像文件&#xff1a;docker pull nacos/nacos-server 挂载目录&#xff1a; mkdir -p /mydata/nacos/logs/ #新建logs目录mkdir -p /mydata/nacos/init.d/ …

最小二乘估计心得

基本思想 存在一组观察值 ( x i , y i ) (x_i, y_i) (xi​,yi​)&#xff0c;其中 y i y_i yi​和 x i x_i xi​之间满足一定的线性关系&#xff0c;如 y a 0 f 0 ( x ) a 1 f 1 ( x ) . . . a m − 1 f m − 1 ( x ) y a_0 f_0(x) a_1 f_1(x) ... a_{m-1} f_{m-1}(x…

改进YOLOv5/YOLOv8:结合华为诺亚VanillaNet Block模块:深度学习中极简主义的力量

YOLOv5结合华为诺亚VanillaNet Block模块 介绍核心代码加入YOLOv5yaml文件:运行结果论文: VanillaNet: the Power of Minimalism in Deep Learning 代码: https://link.zhihu.com/?target=https%3A//github.com/huawei-noah/VanillaNet 介绍 基础模型的核心是 "更多…

Terra-Luna归零一年后:信任重建、加密未来路在何方?

本月既是Terra-Luna归零的一周年&#xff0c;也是FTX崩溃的第六个月&#xff0c;而这两个事件分别代表着2022年加密市场连环爆的开始与高潮&#xff0c;引发了加密行业15年历史上最可怕的生存危机。 尽管今年市场行情有所回暖&#xff0c;比特币开年至今涨幅70%&#xff0c;以太…

【办公类-19-04】办公中的思考——幼儿姓名笔画数统计(单字、全名字)

结果展示--笔画数统计 背景需求 中6班幼儿都能够书写学号&#xff08;基本没有镜像了&#xff09;&#xff0c;于是我开始尝试让幼儿熟悉自己的“姓氏”&#xff0c;并书写姓氏&#xff08;单字&#xff09;。4位幼儿能够默写全名&#xff0c;3位幼儿可以默写名字中的某一个字…

3*5差值结构参照1分类迭代次数比较

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入有3个节点&#xff0c;训练集AB各由5张二值化的图片组成&#xff0c;让A中有6个1&#xff0c;B中全是1&#xff0c;排列组合A &#xff0c;统计迭代次数并排序。共收集到了181个不同的迭代次数&#xff0c;其中有4个 A-B 迭…

创建web后端程序(servlet程序搭建)

目录 一、Servlet概述 二、创建servlet程序 1.创建类继承HttpServlet 2.重写HttpServlet类中 service、destroy、init方法 3.重新启动服务器 一、Servlet概述 Server Applet的简称&#xff0c;用Java编写的服务器端的程序。它运行在web服务器中&#xff0c;web服务器负责…

路径规划算法:基于回溯搜索优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于回溯搜索优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于回溯搜索优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

Android逆向学习之Frida逆向与抓包实战学习笔记(持续更新中)

学习资料:《安卓Frida逆向与抓包实战》陈佳林/著 文章目录 基础环境第三章 Frida逆向入门之Java层hook3.1 frida基础3.1.3frida基础知识frida存在两种操作模式frida操作App的方式有两种 3.1.4Frida IDE配置 3.2 frida脚本入门3.2.1 frida脚本的概念3.2.2 Java层hook基础1.hook…

续---初识HTML!!!(结束篇)

续———初识HTML&#xff01;&#xff01;&#xff01; 一、表单 1.表单的作用 关于表单的作用&#xff1a;表单最大的作用就是收集用户的信息&#xff0c;用户填写表单&#xff0c;点击提交数据给服务器。 2.如何画出表单&#xff1f; 在HTML中我们采用form标签来画一个…

2023 (ICPC) Jiangxi Provincial Contest -- Official Contest

A. Drill Wood to Make Fire 输出即可 #include<bits/stdc.h> #define int long long #define x first #define y second using namespace std; const int N1100; typedef pair<int,int>pii;int m,n; int a[N][N];void solve() {int s,v,n;cin>>n>>s&…

Kali-linux Arpspoof工具

Arpspoof是一个非常好的ARP欺骗的源代码程序。它的运行不会影响整个网络的通信&#xff0c;该工具通过替换传输中的数据从而达到对目标的欺骗。本节将介绍Arpspoof工具的 使用。 9.8.1 URL流量操纵攻击 URL流量操作非常类似于中间人攻击&#xff0c;通过目标主机将路由流量注…

腾讯T4大牛整理的SpringBoot文档,覆盖你认知中的所有操作

SpringBoot目前的使用已经很普遍了&#xff0c;实际的项目中&#xff0c;我们需要集成各种的插件支持&#xff0c;不仅如此&#xff0c;还有很多可能我们平时不知道&#xff0c;但是很方便的操作。pdf里面的东西还是比较全面的。 1、关于文档 2、获得帮助 3、第一 步 4、使…

【Docker】Docker最近这么火,它到底是什么

前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 &#x1f4d5;作者简介&#xff1a;热…

RMP软件管理、YUM源、磁盘管理。

1、RPM软件管理 1> 通过rpm安装vsftpd软件。 去官网找到xsftpdx86的链接。 2> 查询vsftpd软件包的信息。 3> 卸载软件包vsftpd。 2、YUM软件管理 1> 挂载本地光盘&#xff0c;配置yum源为rhel.repo。 2> 通过yum来安装traceroute。 3> 使用yum查询ifconfig命…

详解如何使用LAMP架构搭建论坛

文章目录 1.LAMP概述2.编译安装Apache httpd服务1.关闭防火墙&#xff0c;将安装Apache所需软件包传到/opt目录下2.安装环境依赖包 3.配置软件模块4.编译及安装5.优化配置文件路径&#xff0c;并把httpd服务的可执行程序文件放入路径环境变量的目录中便于系统识别6.添加httpd系…

位图,布隆过滤器,哈希分割

文章目录 &#x1f680;位图&#x1f4a1;概念&#x1f4a1;接口操作 &#x1f680;布隆过滤器&#x1f4a1;思想&#x1f4a1;实现代码&#x1f4a1;实际应用 &#x1f680;哈希分割 &#x1f680;位图 学习位图前&#xff0c;我们先来看一道题 用哈希表存储每个整数&#…

github在线编程

github在线编程 文章目录 github在线编程两种区别演示项目 Ruoyi-VueGitHub Codespaces 演示github 访问项目使用 GitHubCodeSpace 打开该项目查看运行环境安装运行环境初始化myql数据安装 redis运行前端运行后端前后端运行成功测试安装相关插件 GitPod 演示 说明: 目前总结 gi…

路径规划算法:基于果蝇优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于果蝇优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于果蝇优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法果蝇…