AtCoder Beginner Contest 284.(A--E)

news2024/11/20 0:27:50

AtCoder Beginner Contest 284

  • A - Sequence of Strings
    • 1、问题
    • 2、代码
  • B - Multi Test Cases
    • 1、问题
    • 2、代码
  • C - Count Connected Components
    • 1、问题:
    • 2、思路:——并查集、DFS
    • 3、代码
        • 方法1:并查集
        • 方法2:DFS
  • D - Happy New Year 2023
    • 1、问题
    • 2、思路——算数基本定理、欧拉筛
      • 方法一:欧拉筛
      • 方法二:算数基本定理
    • 3、代码
  • E - Sequence of Strings
    • 1、问题
    • 2、思路——DFS
    • 3、代码
        • 链式前向星版邻接表
        • vector版邻接表

(AB题很简单,略过)

传送门:AtCoder Beginner Contest 284

A - Sequence of Strings

1、问题

在这里插入图片描述

2、代码

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
string a[20];
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    for(int i=n-1;i>=0;i--)
    {
        cout<<a[i]<<endl;
    }
    return 0;
}

B - Multi Test Cases

1、问题

在这里插入图片描述

2、代码

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        int count=0;
        while(n--)
        {
            int a;
            scanf("%d",&a);
            if(a%2)count++;
        }
        cout<<count<<endl;
    }
    return 0;
}

C - Count Connected Components

1、问题:

在这里插入图片描述

2、思路:——并查集、DFS

这道题说白了就是让你判断一个图分成了几个集合。
那么最直接的方法就是并查集。

第二种方法就是,DFS直接搜索,看我们搜索几次能够将整个图都遍历一次。

3、代码

方法1:并查集

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=200;
int p[N];
int cnt[N];
int find(int x)
{
    if(x!=p[x])p[x]=find(p[x]);
    return p[x];
}
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)p[i]=i,cnt[i]=1;
    while(m--)
    {
        int x,y;
        cin>>x>>y;
        int px=find(x),py=find(y);
        if(px!=py)
        {
            cnt[py]+=cnt[px];
            cnt[px]=0;
            p[px]=py;
        }
    }
    int nums=0;
    for(int i=1;i<=n;i++)
    {
        if(cnt[i])nums++;
    }
    cout<<nums<<endl;
    return 0;   
}

方法2:DFS

//DFS
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=210,M=1e5;
int h[N],e[M],ne[M],idx;
bool st[N];
int ans;
void add(int x,int y)
{
    e[idx]=y,ne[idx]=h[x],h[x]=idx++;
}
void dfs(int u)
{
    if(st[u])return;
    st[u]=true;
    for(int i=h[u];i!=-1;i=ne[i])
    {
        if(!st[e[i]])
        {
            dfs(e[i]);
        }
    }
}
int main()
{
    memset(h,-1,sizeof h);
    int n,m;
    cin>>n>>m;
    while(m--)
    {
        int x,y;
        cin>>x>>y;
        add(x,y);
        add(y,x);
    }
    for(int i=1;i<=n;i++)
    {
        if(!st[i])
        {
            ans++;
            dfs(i);
        }
    }
    cout<<ans<<endl;
    return 0;
}

D - Happy New Year 2023

1、问题

在这里插入图片描述

2、思路——算数基本定理、欧拉筛

方法一:欧拉筛

这道题的数据范围非常的大,就算我们用O(N)的算法去遍历也会超时,并且超时非常严重。数据范围是: 9 × 1 0 18 9×10 ^{18} 9×1018,而1秒之内,c++最多运算 1 0 9 10^9 109次。

所以只能想别的办法:

将一个数拆成三个数相乘的模式,那么这三个数当中的最小值 x m i n x_{min} xmin。必定满足 x m i n ≤ n 3 x_{min}\leq \sqrt[3]{n} xmin3n

证明的话,显而易见,如果不满足的话,三个数相乘的结果就会大于n。

所以,我们可以去枚举最小值,因为这个最小值要么是 p p p,要么是 q q q。知道其中一个就可以算另外一个。

我们枚举最小值的话,需要在质数中枚举,因此我们可以利用欧拉筛,筛选出质数。我们筛的范围只需要是范围的最大值开三次方,大概是 3 ∗ 1 0 6 3*10^6 3106

但是,现在就有一个问题了。

我们怎么知道我们利用最小的数算出来的那个就是质数呢?

由于这个数可能是大于开三次方的那个范围,因此,我们是不能够查表的。而单独判断的话,时间复杂度是 O ( n ) O(\sqrt n) O(n )。这个复杂度的话,还是会超时。因此,两种方法都行不通。

我们只能从数学的角度分析一下了。

我们的疑问点在于,万一算出来的不是质数是合数怎么办?

根据算数基本定理,一个数可以写成有限个质因数相乘的形式,并且形式是唯一的。

而这道题最后是拆成了三个质数,因此这就是算术基本定理表达结果。根据定理中的唯一性,当我们已经知道其中一个质数的时候,必定能通过计算算出另外一部分相乘的部分。

根据题意, N = p 2 ∗ q N=p^2*q N=p2q

也就是说,我们已经知道了这个数字的算数基本定理的表达形式。

假设我们知道了 q q q,那么算出来的一定是一个质数的平方。

假设我们知道了 p p p,那么我们平方之后再算出来的那个一定是另外一个质数 q q q

所以我们只需要知道其中一个质数即可。

但是,上述的方法依旧是多此一举的方法。

方法二:算数基本定理

我们根本没有必要去利用欧拉筛提前选出所有的质数。

因为,只要是我们从2开始枚举,第一次枚举到的就是质数。

证明:

因为是第一次枚举到的,说明从 2 2 2 i − 1 i-1 i1都没能够整除我们的 n n n。假设我们第一次枚举到的是一个合数,那么这个合数能够分解成更小的质数,这个更小的质数会在次之前被枚举到,如果存在这个数,必定能够整除我们当前枚举到的i,也必定能够整除n。但是在次之前都没有一个数能够整除n。说明我们的假设矛盾,所以不存在这样的可能。

所以我们第一次美枚举到的一定是质数。

当我们知道了质数之后,根据算术基本定理的唯一性,我们就能够从枚举出来的质数出发直接算出另一部分。

3、代码

欧拉筛版本

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int N=3e6+10;
typedef long long ll;
int primes[N],cnt;
bool st[N];
void euler()
{
    int n=3e6;
    for(int i=2;i<=n;i++)
    {
        if(!st[i])primes[cnt++]=i;
        for(int j=0;i<=n/primes[j];j++)
        {
            st[primes[j]*i]=true;
            if(i%primes[j]==0)break;
        }
    }
}
int main()
{
    euler();
    int t;
    ll n;
    cin>>t;
    while(t--)
    {
        cin>>n;
        for(int i=0;i<cnt;i++)
        {
            if(n%primes[i]==0)
            {
                if((ll)(n/primes[i])%primes[i]==0)
                {
                    int p=primes[i];
                    ll q=n/p/p;
                    cout<<p<<" "<<q<<endl;
                    break;
                }
                else
                {
                    int q=primes[i];
                    ll p=(ll)sqrt(n/primes[i]);
                    cout<<p<<" "<<q<<endl;
                    break;
                }
            }
        }    
    }
    return 0;
}

算数基本定理

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int N=3e6+10;
typedef long long ll;

int main()
{
    int t;
    ll n;
    cin>>t;
    while(t--)
    {
        cin>>n;
        for(int i=2;i*i*i<=n;i++)
        {
            if(n%i==0)
            {
                if((ll)(n/i)%i==0)
                {
                    int p=i;
                    ll q=n/p/p;
                    cout<<p<<" "<<q<<endl;
                    break;
                }
                else
                {
                    int q=i;
                    ll p=(ll)sqrt(n/i);
                    cout<<p<<" "<<q<<endl;
                    break;
                }
            }
        }    
    }
    return 0;
}

E - Sequence of Strings

1、问题

在这里插入图片描述

2、思路——DFS

直接DFS就行了,走到一个节点就+1,遇到重复的就返回。

3、代码

链式前向星版邻接表

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=2e5+10,M=2*N;
int h[N],e[M],ne[M],idx;
bool st[N];
int ans=1;
void add(int x,int y)
{
    e[idx]=y,ne[idx]=h[x],h[x]=idx++;
}
void dfs(int u)
{
    if(ans>=1e6)
    {
        cout<<1000000<<endl;
        exit(0);
    }
    st[u]=true;
    for(int i=h[u];i!=-1;i=ne[i])
    {
        if(!st[e[i]])
        {
            ans++;
            dfs(e[i]);
            st[e[i]]=false;
        }
    }
    
}
int main()
{
    memset(h,-1,sizeof h);
    int n,m;
    cin>>n>>m;
    while(m--)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        add(x,y);
        add(y,x);
    }
    dfs(1);
    cout<<ans<<endl;
    return 0;
}

vector版邻接表

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int N=2e6+10;
vector<int>a[N];
bool st[N];
int ans=1;
void dfs(int u)
{
    if(ans>=1e6)
    {
        cout<<1000000<<endl;
        exit(0);
    }
    st[u]=true;
    for(auto x:a[u])
    {
        if(!st[x])
        {
            ans++;
            dfs(x);
            st[x]=false;
        }
    }
}
int main()
{
    int n,m;
    cin>>n>>m;
    while(m--)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        a[x].push_back(y);
        a[y].push_back(x);
    }
    dfs(1);
    cout<<ans<<endl;
    return 0;
}

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

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

相关文章

Linux内核学习笔记——内核页表隔离KPTI机制(源码分析)

KPTI(Kernel PageTable Isolation)全称内核页表隔离&#xff0c;它通过完全分离用户空间与内核空间页表来解决页表泄露。 KPTI中每个进程有两套页表——内核态页表与用户态页表(两个地址空间)。 内核态页表只能在内核态下访问&#xff0c;可以创建到内核和用户的映射&#xf…

单体的 TienChin 和微服务的 TienChin 有何异同?

有不少小伙伴希望松哥能整一个微服务的实战项目&#xff0c;微服务这块技术点其实松哥是讲过很多了&#xff0c;图文版的教程视频版的教程都有&#xff0c;不过确实缺乏一个项目&#xff0c;所以我在想等 TienChin 项目搞完之后&#xff0c;和小伙伴们也来一起搞一个微服务的项…

nacos2.0客户端注册流程分析

版本介绍 copy几个jar包出来康康把 spring-cloud-starter-alibaba-nacos-config-2021.0.4.0.jar spring-cloud-starter-alibaba-nacos-discovery-2021.0.4.0.jar nacos-client-2.0.4.jar 注册流程 读取Spring Boot装载配置文件 spring.factories&#xff0c;找到启动类 Nac…

一步一步学爬虫(4)数据存储之Elasticsearch搜索引擎存储

Elasticsearch搜索引擎存储1. Elasticsearch 介绍2. Elasticsearch 相关概念3. 准备工作3.1 下载程序3.2 解压缩&#xff0c;配置文件修改4. 创建索引5. 删除索引6. 插入数据7. 更新数据8. 删除数据9. 查询数据10. 总结想查数据&#xff0c;就免不了搜索&#xff0c;而搜索离不…

【微信小程序】全局数据共享

小程序中的全局数据共享方案在小程序中可以使用mobx-miniprogram配合mobx-miniprogram-bindings实现全局数据共享。● mobx-miniprogram用来创建Store实例对象● mobx-miniprogram-bindings用来把Store中的共享数据或方法&#xff0c;绑定到组件或页面中使用npm install --save…

Python虚拟环境

学习视频&#xff1a;安装不算完事&#xff0c;只有理解了虚拟环境才算真正掌握 Python 环境 同类笔记&#xff1a;Python虚拟环境 目录 一、什么是虚拟环境 二、虚拟环境相关工具的使用和原理 创建虚拟环境 虚拟环境目录分析 虚拟环境的激活 虚拟环境做了什么 退出虚…

【论文精读】360MVSNet

今天读的是发表在WACV2023上的MVS文章&#xff0c;该文章提出了基于全景相机的MVS pipeline。 文章链接&#xff1a;点击前往 代码链接&#xff1a;暂未开源。 文章目录Abstract1. Introduction2. Related works3. Method3.1 Feature Extraction3.2 360 Spherical Sweeping3.2.…

【经典笔试题2】

test1 test2 test3 test4 test5 test1 int main() {int a[5] { 1, 2, 3, 4, 5 };int *ptr (int *)(&a 1);printf( "%d,%d", *(a 1), *(ptr - 1));return 0; } 程序的结果是什么&#xff1f;首先分析代码&#xff0c;a是数组名&#xff0c;是数组首元素…

详解Web服务器与http https协议工作过程

Web服务器 URL URI URL是URI的一个子集 www www所用的协议 http请求报文分析 状态码&#xff08;空行&#xff1a;最后一 个响应头部之后是一个空行&#xff0c;发送回车符和换行符&#xff0c;通知服务器以下不再有响应头部。&#xff09; 网址解析 网址注释实例 HTT…

从工厂方法到注解的小例子

目录一、背景介绍二、思路&方案三、过程过程图一过程图二过程图三过程图四(运行时的图)代码四、总结五、升华一、背景介绍 上篇"自定义注解和注解解析器",通过小例子介绍了自定义注解的运用&#xff1b;本篇继续基于小例子来实现工厂方法&#xff0c;以及注解实…

linux Regmap API

1.针对 I2C 和 SPI 设备寄存器的操作都是通过相关的 API 函数进行操作的。这样 Linux 内核中就会充斥着大量的重复、冗余代码&#xff0c;但是这些本质上都是对寄存器的操作&#xff0c;所以为了方便内核开发人员统一访问I2C/SPI 设备的时候&#xff0c;为此引入了 Regmap 子系…

如何用智能地教狗狗上厕所

背景 22年养了一只很可爱的小狗狗&#xff0c;我其实就一个问题&#xff1a;为啥这么可爱的狗狗会拉屎撒尿呀&#xff1f; 自从崽崽来了我们家之后&#xff0c;最让我们头疼的就是它乱拉、乱尿的问题了&#xff0c;以前会在家里到处乱来&#xff0c;最近一段时间好了很多&…

机器学习(整体结构)

国科大《机器学习》内容&#xff0c;周晓飞老师讲的挺不错的&#xff0c;浅显易懂。 本来是想整理下课程内容的&#xff0c;然而动手后才发现内容过多&#xff08;很想吐槽&#xff0c;为啥这么多模型&#xff1f;不能相互替代么&#xff1f;&#xff09;简略画个思维导图算啦…

探索SpringMVC-HandlerAdapter之RequestMappingHandlerAdapter-返回值处理

前言 上回我们回答了ReqeustMappingHandlerAdapter调用目标方法的参数解析问题&#xff0c;今天我们再来回答第二个问题&#xff1a;怎么处理方法调用的返回值。 深入分析返回值处理需求 RequestMapping处理器的返回值类型 相信很多同学对于这个返回值的第一个反应就是返回一…

图解JDK1.7中HashMap头插法扩容造成的死循环问题

JDK1.7中HashMap头插法扩容造成的死循环问题 文章目录JDK1.7中HashMap头插法扩容造成的死循环问题一、背景二、源码解读三、图解单线程环境中扩容多线程环境中扩容四.总结一、背景 HashMap是线程不安全的&#xff0c;在并发使用HashMap时很容易出现一些问题&#xff0c;其中最…

ArcGIS基础实验操作100例--实验66符号图层的保存与加载

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验66 符号图层的保存与加载 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff0…

【OpenGL】基础光照

介绍 现实世界中的光照是极其复杂&#xff0c;难以计算的&#xff0c;因此OpenGL的光照使用的是简化的模型&#xff0c;其中一个模型被称为冯氏光照模型(Phong Lighting Model)。 冯氏光照模型的主要结构由三个分量组成&#xff1a; 环境(Ambient)光照漫反射(Diffuse)光照镜…

blender学习笔记2023.01.05

文章目录why基操why 想画条大黄鱼 想画一下渔网 网箱 写笔记预防忘记 基操 1.语言改为中文 不过后续可能改回英文去 2.顶部导航栏—编辑—偏好设置—界面—翻译—&#xff08;关掉&#xff09;新建数据 目的是预防插件导致奇奇怪怪的报错 这里左下角位置处点击 保存修改 3…

初识LCD1602及编程实现字符显示

一、LCD1602基础知识及接线方法LCD1602是一种工业字符型液晶&#xff0c;能够同时显示16x02即32字符&#xff08;16列两行&#xff09;引脚说明第 1 脚: VSS 为电源地 第 2 脚: VDD 接 5V 正电源 第 3 脚: VL 为液晶显示器对比度调整端,接正电源时对比度最弱&#xff0c;接地时…

【Neo4j构建知识图谱】:官方服务图谱大型数据集下载与可视化方法【数据集包括:食谱数据、足球、权力的游戏、美国宇航局、英国公司注册、财产所有权、政治捐款】

目录 1、服务端口免费查看知识图谱2、关于 Neo4j 示例数据集的实现3、下载离线数据集4、项目概览与实现案例还可以看到解析python源码还可以看到解析cypher源码各种数据集实现案例参考1、服务端口免费查看知识图谱 此服务器托管许多具有只读访问权限的数据集,供公众使用。 该…