每天一道 CodeForces 构造/思维题 (day1)

简介: 每天一道 CodeForces 构造/思维题 (day1)

每天一道 CodeForces 构造/思维题 (day1)

题目

题目链接 C. Fishingprince Plays With Array

题目大意:

给你一个数组 a,通过两种操作无限次能否得到数组 b

操作1:每次可以选择一个a[i],如果a[i]能够整除mt = a[i] / m那么就可以将a[i] 转换为 mt ,也就是[a[i]] => [t, t, t... t]

操作2:选择连续m个相同的值a[i],将其转换为 m * a[i] ,其实也就是操作1的反操作

思路

这道题正向思维怎么想都想不出来,需要考虑的因素太多了,因为有无限多操作的可能性,如果思维一直是如何将数组a如何转化为b的话无论怎么写都写不出来。所以我们可以想象逆向思维,操作1和操作2是相反操作,由a操作得到b,那么也可以由b操作得到a,这两种方式互相求也求不出来,那么我们想一想能不能将这两个数组都转化为一个中间数组c,如果它俩的中间数组相同,那么也就可以相互转换,类似于:

A = C

B = C

A = B

那么怎么求中间数组c?

我们可以将两个数组都只使用操作1,将能使用操作1的数组都一直除于m,一直到不能操作为止,这样就能够让A -> C -> B

为什么不用操作2?合二为一简单还是一分为二简单?显然是一分为二。聚合一起有太多的可能操作了。

操作完之后,由于得到的两个数组c1,c2长度是不一样的,这里要使用双指针算法来比较两个是否相同

比如,我们得到了这样两个中间数组

1 1 2 2

2 2 2

两个1和一个2对应,所以最后的复杂度是O( (n + k ) * log( max( a[i] ) ) )

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
#define x first
#define y second
const int N = 1e6 + 10;
PII a[N], b[N]; // 这里定义的数组a,b表示操作后的中间数组
void solve()
{
    int n, m, k;
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
    {
        int t, w;
        cin >> t;
        w = t;
        while (t % m == 0)
        {
            t /= m;
        }
        // t最多可以分解成多少个
        a[i] = {t, w / t};
    }
    cin >> k;
    for (int i = 1; i <= k; i++)
    {
        int t, w;
        cin >> t;
        w = t;
        while (t % m == 0)
        {
            t /= m;
        }
        b[i] = {t, w / t};
    }
    int l = 1, r = 1;
    while (l <= n && r <= k)
    {
        if (a[l].x != b[r].x)
        {
            break;
        }
        if (a[l].y > b[r].y)
        {
            a[l].y -= b[r].y;
            r++;
        }
        else if (a[l].y == b[r].y)
        {
            l++;
            r++;
        }
        else
        {
            b[r].y -= a[l].y;
            l++;
        }
    }
    if (l == n + 1 && r == k + 1)
        puts("Yes");
    else
        puts("No");
    return;
}
signed main()
{
    // freopen("in.in", "r", stdin);
    // freopen("out.out", "w", stdout);
    int t;
    cin >> t;
    while (t--)
    {
        solve();
    }
    return 0;
}
相关文章
|
Java 编译器 C语言
Python速成篇(基础语法)上
Python速成篇(基础语法)上
|
存储 缓存 网络协议
HTTP协议【网络基础/应用层】
HTTP协议【网络基础/应用层】
934 3
|
8月前
|
数据采集 机器学习/深度学习 人工智能
从杂乱数据到智能洞察:2025年竞品分析工具的"场景化革命"
本报告全景解析竞品分析工具的技术演进与智能应用,涵盖四代技术变迁、核心架构、主流工具解析及实施方法论,助力企业构建数据驱动的竞争优势。
847 0
|
安全 前端开发 API
ThinkPHP5 API模块开发规范与示例
【7月更文挑战第6天】本技术文档旨在指导开发者如何完全遵循ThinkPHP5框架的开发规范来构建RESTful API模块。ThinkPHP5(简称TP5)是一款基于PHP的轻量级MVC框架,其简洁、高效的特点非常适合快速开发Web应用及API接口。以下是创建API模块的基本步骤、最佳实践以及代码示例。
920 0
|
运维 算法 数据管理
2025有哪些好用的电话系统推荐?(详解电话系统4大核心功能)
电话系统基于CTI和云计算技术,集成了电话、在线客服、短信等多媒体通讯方式,提供高效、多元化的沟通渠道。其核心功能包括高效呼叫、对接集成、智能化服务和数据管理。
750 12
|
消息中间件 SQL RocketMQ
【RocketMQ系列五】消息示例-顺序消息&延迟消息&广播消息的实现
【RocketMQ系列五】消息示例-顺序消息&延迟消息&广播消息的实现
890 1
|
前端开发 搜索推荐 Java
基于SSM实现个性化健康饮食推荐系统
本项目基于SSM框架开发实现了一针对个人体质情况进行日常食谱推荐的信息化管理系统。系统分为前端信息展示页面和后台信息管理操作,用户登陆前端系统,可以查看相关饮食信息,热点资讯等,并可以对个人的体质信息进行相应的管理操作,也可以根据系统推荐的饮食方案来进行查看,并可以在线查看美食介绍的相关视频。后台管理操作主要包含用户管理、饮食方案管理,用户饮食方案定制,资讯信息管理,反馈管理,轮插图管理等相关功能。系统整个体功能完整,结构清晰,适合做毕业设计和课程设计使用。...
1735 0
基于SSM实现个性化健康饮食推荐系统
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的优化算法
本文将探讨深度学习中的几种常见优化算法,包括梯度下降、动量方法、AdaGrad、RMSProp和Adam。这些算法在训练神经网络时发挥着重要作用,通过调整学习率和更新策略,能够显著提高模型的训练效率和性能。了解这些优化算法有助于更好地应用深度学习技术解决实际问题。
|
开发者 Python
确保你的Python环境中已经安装了`python-docx`模块。如果还没有安装,可以通过pip来安装:
确保你的Python环境中已经安装了`python-docx`模块。如果还没有安装,可以通过pip来安装:
|
机器学习/深度学习 数据采集 人工智能
数据科学实训案例研发:农业遥感图像数据分析上线阿里云
这是2020年阿里云计算有限公司-教育部产学合作协同育人项目的成果。 实训课程内容涵盖了主要内容涵盖了图像分割的基础知识,主要包括图像分割的概论、基础、分类、神经网络实现等经典的机器学习理论知识,也包括卷积神经网络、残差网络、U-Net算法、多模态等深度学习内容。此外,还介绍天池AI等平台的应用,在此基础上通过实验的方式,详细地介绍机器视觉在农业大数据分析领域的过程,以及遥感图像处理相关技术的原理与实践。结合阿里云的产品和技术资源,进行应用实验,让学生在充分理解掌握基础知识的同时,也能接触到业界最前沿的发展方向和成果。本课程通过实验大作业的方式,实现典型的机器视觉应用,训练学生模型设计与应用。
862 0

热门文章

最新文章

下一篇
开通oss服务