ABC322刷题记

ABC322刷题记

T1.A

A - First ABC 2。

妥妥的简单题……

用find函数做就行。(如果不存在那个子串就返回-1,否则返回第一次出现位置)

注意题目中编号是从1开始的。

时间复杂度:O(log(n))。find函数有一定代价,我记得是log。

#include<bits/stdc++.h>
using namespace std;
string str="";
int n=0;
int main(){
    scanf("%d",&n);
    cin>>str;
    //输入
    str=" "+str;
    //处理:把0开头改成1开头
    printf("%d\n",str.find("ABC"));
    //输出答案
    return 0;
}

T2.B

B - Prefix and Suffix。

前两题都一样简单。

用substr截取出t中与s长度相同的前缀和后缀,分别和s比较即可。

时间复杂度先不算了,因为肯定够。

#include<bits/stdc++.h>
using namespace std;
int m=0,n=0;
string s="",t="";
int main(){
    scanf("%d%d",&n,&m);
    cin>>s>>t;
    //输入
    string front=t.substr(0,n),rear=t.substr(m-n,n);
    //去除前缀与后缀
    if(front==s&&rear==s){
        printf("0\n");
    }else{
        if(front==s&&rear!=s){
            printf("1\n");
        }else{
            if(front!=s&&rear==s){
                printf("2\n");
            }else{
                printf("3\n");
            }
        }
    }
    //对号入座,输出不错
    return 0;
}

T3.C

C - Festival。

还是辣墨简单……

用b数组记录某一天是否有烟花,在用ans数组从后往前算,其中ans[i]表示离第i天最近并且时间不比第i天早的放烟花的日子与第i天相差多少。

最后从1到n输出ans的对应项即可。

时间复杂度:O(n),应该是最优的思路了。

#include<bits/stdc++.h>
#define M 220000
#define N 220000
using namespace std;
int ans[N]={},a[M]={},m=0,n=0;
bool b[N]={};
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        scanf("%d",&a[i]);
        b[a[i]]=true;
    }
    //输入,并维护b数组
    for(int i=n;i>=1;i--){
        if(b[i]==true){
            ans[i]=0;
            //①当前这一天就有烟花:距离为0
        }else{
            ans[i]=ans[i+1]+1;
            //②当前这一天没有烟花:比明天的距离多一天
        }
    }
    //计算ans
    for(int i=1;i<=n;i++){
        printf("%d\n",ans[i]);
    }
    //输出答案
    return 0;
}

T4.D

D - Polyomino。

客观来说,我这道题没做出来真有些丢人。

其实就是一个dfs,但是一个变量名害我找了1天6小时34分钟……

我们定义一个结构体,存储一块牌,如果一个坐标上有点,就记录为1,否则记录为0。支持项各个方向平移(如果会出格,就返回不能做,否则返回操作成功)、顺时针旋转、逆时针旋转操作,当然还要封装加法(把骨牌拼接起来,其实就是相同坐标的点记录的数相加,如果相加后和为0,就说明这里本来就没有点,如果为1就说明刚好有一个牌上有,如果大于1就说明有多个牌子上面有这个点,当然,只有当3块牌都记起来之后和为1才能说明这种摆法可能合法)、等于号(骨牌完全相同,用于判断拼完之后是不是和满牌相同)。

在dfs中,我们不难证明先旋转(遍历旋转次数,去时顺时针,回时逆时针),在平移(反方向的平移互相作为返回操作)是不会有问题的,当然要注意平移可以项各种方向平移多次。

最终大体流程是这样:使用dfs,遍历三个牌的操作,如果最后拼起来是满牌就说明可以达成目的,直接标记最终答案为“可行”,并一路退出回到主程序,否则继续往下遍历。遍历操做时,先考虑旋转,再考虑平移。最后输出Yes/No即可。

时间复杂度不好算,这里不展开描述,但是数据量都是4、16这类数,估计也没啥事。

#include<bits/stdc++.h>
using namespace std;
struct Info{
    int num[4][4];
    Info operator+(Info ot){
        Info ret={};
        for(int i=0;i<4;i++){
            for(int j=0;j<4;j++){
                ret.num[i][j]=num[i][j]+ot.num[i][j];
            }
        }
        return ret;
    }
    //拼接
    bool operator==(Info ot){
        for(int i=0;i<4;i++){
            for(int j=0;j<4;j++){
                if(num[i][j]!=ot.num[i][j]){
                    return false;
                }
            }
        }
        return true;
    }
    //判等
    bool down(){
        for(int i=0;i<4;i++){
            if(num[3][i]==1){
                return false;
            }
        }
        for(int i=3;i>=1;i--){
            for(int j=0;j<4;j++){
                num[i][j]=num[i-1][j];
            }
        }
        for(int i=0;i<4;i++){
            num[0][i]=0;
        }
        return true;
    }
    //下移
    bool left(){
        for(int i=0;i<4;i++){
            if(num[i][0]==1){
                return false;
            }
        }
        for(int i=0;i<=2;i++){
            for(int j=0;j<4;j++){
                num[j][i]=num[j][i+1];
            }
        }
        for(int i=0;i<4;i++){
            num[i][3]=0;
        }
        return true;
    }
    //左移
    bool right(){
        for(int i=0;i<4;i++){
            if(num[i][3]==1){
                return false;
            }
        }
        for(int i=3;i>=1;i--){
            for(int j=0;j<4;j++){
                num[j][i]=num[j][i-1];
            }
        }
        for(int i=0;i<4;i++){
            num[i][0]=0;
        }
        return true;
    }
    //右移
    bool up(){
        for(int i=0;i<4;i++){
            if(num[0][i]==1){
                return false;
            }
        }
        for(int i=0;i<=2;i++){
            for(int j=0;j<4;j++){
                num[i][j]=num[i+1][j];
            }
        }
        for(int i=0;i<4;i++){
            num[3][i]=0;
        }
        return true;
    }
    //上移
    void spina(){
        Info ret={};
        for(int i=0;i<4;i++){
            for(int j=0;j<4;j++){
                ret.num[i][j]=num[3-j][i];
            }
        }
        memcpy(num,ret.num,sizeof(num));
        return;
    }
    //顺时针旋转
    void spinb(){
        Info ret={};
        for(int i=0;i<4;i++){
            for(int j=0;j<4;j++){
                ret.num[i][j]=num[j][3-i];
            }
        }
        memcpy(num,ret.num,sizeof(num));
        return;
    }
    //逆时针旋转
};
Info inf[10]={};
bool ans=false;
inline void dfs(int d);
//深度优先搜索用到函数
inline void tmovew(int d);
//遍历旋转,用完后返回原始状态
inline void tmovex(int d);
//遍历横移,用完后返回原始状态
inline void tmovey(int d);
//遍历竖移,用完后返回原始状态
int main(){
    inf[4]={{{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}}};
    //满牌
    for(int i=0;i<4;i++){
        string str="";
        cin>>str;
        for(int j=0;j<4;j++){
            if(str[j]=='#'){
                inf[1].num[i][j]=1;
            }
        }
    }
    for(int i=0;i<4;i++){
        string str="";
        cin>>str;
        for(int j=0;j<4;j++){
            if(str[j]=='#'){
                inf[2].num[i][j]=1;
            }
        }
    }
    for(int i=0;i<4;i++){
        string str="";
        cin>>str;
        for(int j=0;j<4;j++){
            if(str[j]=='#'){
                inf[3].num[i][j]=1;
            }
        }
    }
    //输入,并处理成Info格式
    dfs(1);
    //dfs
    if(ans==false){
        printf("No\n");
    }else{
        printf("Yes\n");
    }
    //根据答案输出
    return 0;
}
inline void dfs(int d){
    if(d==4){
        //3个骨牌遍历完成
        if(inf[1]+inf[2]+inf[3]==inf[4]){
            ans=true;
            //若相加为满牌,就说明答案可行,直接记录答案为“Yes”,或者说true
        }
        return;
        //递归出口
    }
    if(ans==true){
        return;
        //已经找到答案,无需继续遍历
    }
    tmovew(d);
    //开始遍历旋转
    return;
}
inline void tmovew(int d){
    for(int i=0;i<=3;i++){
        for(int j=1;j<=i;j++){
            inf[d].spina();
        }
        //顺时针旋转相应次
        tmovex(d);
        //往下遍历横移
        for(int j=1;j<=i;j++){
            inf[d].spinb();
        }
        //逆时针转回去(回溯)
    }
    return;
}
inline void tmovex(int d){
    for(int i=0;i<=4;i++){
        int sum=0;
        //尽最大可能地往相应方向移动i次,sum记录实际上操作成功的次数,后面所有的sum都同理
        for(int j=1;j<=i;j++){
            if(inf[d].left()==true){
                sum++;
            }
        }
        //往左移动
        tmovey(d);
        //往下遍历竖移
        for(int j=1;j<=sum;j++){
            inf[d].right();
        }
        //往右移动,也就是回溯
    }
    for(int i=0;i<=4;i++){
        int sum=0;
        for(int j=1;j<=i;j++){
            if(inf[d].right()==true){
                sum++;
            }
        }
        //往右移动
        tmovey(d);
        //往下遍历竖移
        for(int j=1;j<=sum;j++){
            inf[d].left();
        }
        //往左移动,也就是回溯
    }
    return;
}
inline void tmovey(int d){
    for(int i=0;i<=4;i++){
        int sum=0;
        for(int j=1;j<=i;j++){
            if(inf[d].down()==true){
                sum++;
            }
        }
        //往下移动
        dfs(d+1);
        //往下递归
        for(int j=1;j<=sum;j++){
            inf[d].up();
        }
        //往上移动,也就是回溯
    }
    for(int i=0;i<=4;i++){
        int sum=0;
        for(int j=1;j<=i;j++){
            if(inf[d].up()==true){
                sum++;
            }
        }
        //往上移动
        dfs(d+1);
        //往下递归
        for(int j=1;j<=sum;j++){
            inf[d].down();
        }
        //往下移动,也就是回溯
    }
    return;
}

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

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

相关文章

Qt 信号和槽执行线程问题

Qt 信号和槽执行线程问题 1.QObject的thread() 函数 在Qt中QObject有一个thread() 的函数。这就说明&#xff0c;每一个QOject对象都有所属的线程。 注意&#xff1a; QThread也是一个QObject的子类&#xff0c;也有自己所在的线程每个QObject存在父子关系&#xff0c;存在…

【Java-LangChain:面向开发者的提示工程-6】文本转换

第六章 文本转换 LLM非常擅长将输入转换成不同的格式&#xff0c;典型应用包括多语种文本翻译、拼写及语法纠正、语气调整、格式转换等。 本章节将介绍如何使用编程的方式&#xff0c;调用API接口来实现“文本转换”功能。 环境配置 参考第二章的 环境配置小节内容即可。 文…

java复习回顾

文章目录 0 开发工具1. 对象和类、三大特性2. 成员/实例变量和实例变量&#xff08;this关键字&#xff09;3. 方法重载overload4. 构造方法和this关键字5. 继承6. 访问修饰符7. 方法重写8. 继承下的构造执行9. 多态9.1 向上转型9.2 向下转型9.3 多态的应用 0 开发工具 Maven是…

Acwing 907. 区间覆盖

Acwing 907. 区间覆盖 知识点题目描述思路讲解代码展示 知识点 贪心 题目描述 思路讲解 代码展示 #include <iostream> #include <algorithm>using namespace std;const int N 100010;int n;struct Range {int l, r;bool operator < (const Range &W) …

分页前后端完整代码

一、后端代码 User实体类要继承PageVo package com.like.entity;import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.like.common.PageVo; import…

借助ChatGPT的神奇力量,解锁AI无限可能!

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;目前学习C/C、算法、Python、Java等方向&#xff0c;一个正在慢慢前行的普通人。 &#x1f3c0;系列专栏&#xff1a;陈童学的日记 &#x1f4a1;其他专栏&#xff1a;CSTL&…

计算机毕业设计 基于SSM的宿舍管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

时间序列-AR模型与MA模型的原理与实现

文章目录 1 自回归模型AR Model1.1 自回归模型 vs 多元线性回归模型1.1.1 线性回归1.1.2 AR(1)模型1.1.3 AR(p)模型 1.2 AR建模问题 2 移动平均模型 MA Model2.1 MA模型的数学表示2.1.1 MA(1)模型2.2.2 MA(q)模型 2.2 MA建模问题 ARIMA模型是AR模型&#xff08;自回归模型&…

使用 Python 给 PDF 添加目录书签

0、库的选择——pypdf 原因&#xff1a;Python Version Support Python 3.11 3.10 3.9 3.8 3.7 3.6 2.7 pypdf>3.0 YES YES YES YES YES YES PyPDF2>2.0 YES YES YES YES YES YES PyPDF2 1.20.0 - 1.28.4 YES YES YES YES YES YES P…

c语言练习74: 分割数组中数字的数位

分割数组中数字的数位 题⽬描述&#xff1a; 给你⼀个正整数数组 nums &#xff0c;请你返回⼀个数组 answer &#xff0c;你需要将 nums 中每个整数进⾏数位 分割后&#xff0c;按照 nums 中出现的 相同顺序 放⼊答案数组中。 对⼀个整数进⾏数位分割&#xff0c;指的是将整…

91、Redis - 事务 与 订阅-发布 相关的命令 及 演示

★ 事务相关的命令 Redis事务保证事务内的多条命令会按顺序作为整体执行&#xff0c;其他客户端发出的请求绝不可能被插入到事务处理的中间&#xff0c; 这样可以保证事务内所有命令作为一个隔离操作被执行。 Redis事务同样具有原子性&#xff0c;事务内所有命令要么全部被执…

2、【第一步】Qlib安装

Qlib安装 Qlib同时支持Windows和Linux。建议在Linux中使用Qlib。Qlib支持Python3,最高支持到Python3.8。 用户可以按照以下命令通过 pip 轻松安装 Qlib: pip install pyqlib同样,用户也可以按照以下步骤通过源代码安装 Qlib: 进入Qlib的根目录。然后,请执行以下命令来安装…

2024北京智慧养老展,北京养老应用软件展,北京陪护机器人展

2024第11届中国&#xff08;北京&#xff09;国际智慧养老产业展览会 The 2024 China (Beijing) international pension Industry Exhibition 时间&#xff1a;2024年04月10日—12日 展馆&#xff1a;北京亦创国际会展中心 承办&#xff1a;北京联诚国际展览有限公司 大会概要…

年度顶级赛事来袭:2023 CCF大数据与计算智能大赛首批赛题上线!

久等了&#xff01; 大数据与人工智能领域年度顶级盛事——2023 CCF大数据与计算智能大赛——首批赛题已上线&#xff0c;大赛火力全开&#xff0c;只等你来挑战&#xff01; 大赛介绍 CCF大数据与计算智能大赛&#xff08;CCF Big Data & Computing Intelligence Contes…

深入学习git

1、git原理及整体架构图 一些常用的命令 git add . 或 git add src/com/ygl/hello/hello.java 指定文件 git commit . 或 git commit src/com/ygl/hello/hello.java 指定文件 git push origin 分支名称 2、git stash的应用场景 场景一&#xff1a;你正在当前分支A开发&…

CA(openssl)

目录 创建私有CA 1、创建CA所需要的文件 2、生成CA私钥 3、生成CA自签名证书 申请证书并颁发证书 1、为需要使用证书的主机生成私钥 2、为需要使用证书的主机生成证书申请文件 3、在CA签署证书并将证书颁发给请求者 改变检查策略 4、查看证书中的信息 5、index.txt和…

多目标平衡黏菌算法(MOEOSMA)求解八个现实世界受约束的工程问题

目录 1 受约束的工程问题 1.1 减速器设计问题(Speed reducer design problem) 1.2 弹簧设计问题(Spring design problem) 1.3 静压推力轴承设计问题(Hydrostatic thrust bearing design problem) 1.4 振动平台设计问题(Vibrating platform design problem) 1.5 汽车侧面碰…

云安全【阿里云ECS攻防】

关于VPC的概念还请看&#xff1a;记录一下弹性计算云服务的一些词汇概念 - 火线 Zone-安全攻防社区 一、初始化访问 1、元数据 1.1、SSRF导致读取元数据 如果管理员给ECS配置了RAM角色&#xff0c;那么就可以获得临时凭证 如果配置RAM角色 在获取ram临时凭证的时候&#xff…

铁道货车通用技术条件

声明 本文是学习GB-T 5600-2018 铁道货车通用技术条件. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 90 mm90 mm。 B.2 制造要求 B.2.1 车体钢结构组成后&#xff1a; a) 敞车钢质侧、端板的平面度公差应小于或等于15 mm/m; 压型侧、端板的平面度…

python生成中金所期权行权价

参考沪深300股指期权的合约表&#xff0c;写一个工具函数&#xff1a; 使用方法 def get_format_option_gap(value: float, deviation: int 0): # 根据中证1000指数获取点位"""根据标准的行权价&#xff0c;生成不同档位的期权列表&#xff0c;适合中金所:…