[abc复盘] abc301 20230514

news2024/11/26 16:38:17

[abc复盘] abc301 20230514

    • 总结
    • A - Overall Winner
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • B - Fill the Gaps
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • C - AtCoder Cards
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • D - Bitmask
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • E - Pac-Takahashi
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 六、参考链接

总结

  • ac4题,赛后补了E
  • T1 计数
  • T2 单源最短路dijikstra
  • T3 多源最短路floyd
  • 在这里插入图片描述

A - Overall Winner

链接: A - Overall Winner

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 模拟

3. 代码实现

PROBLEM = """给一个只有A、T组成的字符串s,
谁多谁赢,一样多就从左到右看,谁先达到这个数。
"""
"""计数,一样多就看最后一个数是谁谁输"""

#       ms
def solve():
    n, = RI()
    s, = RS()
    cnt = Counter(s)
    # print(cnt)
    if cnt['T'] > cnt['A']:
        print('T')
    elif cnt['T'] < cnt['A']:
        print('A')
    else:
        if s[-1] == 'T':
            print('A')
        else:
            print('T')

B - Fill the Gaps

链接: B - Fill the Gaps

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 直接模拟。

3. 代码实现

PROBLEM = """给长为n的数组a,保证相邻的数不同。
在a中添加数,规则如下:
若a[i]<a[i+1],添加a[i]+1,a[i]+2..a[i+1]-1.
若a[i]>a[i+1],添加a[i]-1,a[i]-2..a[i+1]+1.
"""
"""直接模拟"""


#       ms
def solve():
    n, = RI()
    a = RILST()
    ans = [a[0]]
    for i in range(1, n):
        v = a[i]
        if ans[-1] < v:
            ans.extend(list(range(ans[-1] + 1, v)))
        else:
            ans.extend(list(range(v + 1, ans[-1]))[::-1])
        ans.append(v)
    print(*ans)

C - AtCoder Cards

链接: C - AtCoder Cards

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 由于可以重排t,就是个普通的计数。wa2次不该。

3. 代码实现

PROBLEM = """给两个字符串s和t,只含小写字母和'@'。
其中'@'可以替换成任意'atcoder'几个字符中的一个。
开始前,你可以重排t。问是否能使s和t完全相同。
"""
"""计数每个字符,计算差异。最终看看差异的字符能否用对方行的'@'补回来即可。
"""

#       ms
def solve():
    s, = RS()
    t, = RS()
    cnt = Counter()
    x = y = 0
    for a, b in zip(s, t):
        if a == '@':
            x += 1
        else:
            cnt[a] += 1
        if b == '@':
            y += 1
        else:
            cnt[b] -= 1
    # print(cnt, x, y)
    for k, v in cnt.items():
        if v == 0:
            continue
        if k not in 'atcoder':
            return print('No')
        if v > 0 and y >= v:
            y -= v
        elif v < 0 and x >= -v:
            x += v
        else:
            return print('No')

    print('Yes')

D - Bitmask

链接: D - Bitmask

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 直接贪心比较好。

3. 代码实现

PROBLEM = """给一个只含'01?'的01字符串,你可以把'?'替换成0/1.
给一个数字n。问s能生成的最大数字x(x<=n)是多少。
"""
"""
- s长度超过n,且前边的位数有1是无法生成的,返回-1;否则可以都填0
- 后边对齐的位,前缀相同的情况下,出现n里0,s是1是非法的。否则一定可以生成。
类似数位dp的dfs即可,贪心的让每位优先取1再取0。
---
另外,可以直接贪:
先把所有1放到数字里,计算这些1是否已经>n,返回-1;
否则:
从高到低,对s里每个?,尝试放1,不行就放0.
"""

#       ms
def solve():
    s, = RS()
    n, = RI()
    p = bin(n)[2:]
    if len(s) < len(p):
        s = s.replace('?', '1')
        return print(int(s, 2))
    if len(s) >= len(p):
        d = len(s) - len(p)
        for i in range(d):
            if s[i] == '1':
                return print(-1)
        s = s[d:]

        for x, y in zip(s, p):
            if y == '1' and x in '?0':
                break
            if y == '0' and x == '1':
                return print(-1)

        ans = []

        def dfs(i, is_limit):
            if i == len(s):
                return True

            if s[i] != '?':
                if is_limit and s[i] > p[i]:
                    return False
                ans.append(s[i])
                if dfs(i + 1, is_limit and s[i] == p[i]):
                    return True
                ans.pop()
            else:
                if not is_limit or p[i] == '1':
                    ans.append('1')
                    if dfs(i + 1, is_limit and '1' == p[i]):
                        return True
                    ans.pop()
                ans.append('0')
                if dfs(i + 1, is_limit and '0' == p[i]):
                    return True
                ans.pop()
            return False

        if dfs(0, True):
            print(int(''.join(ans), 2))
        else:
            print(-1)

E - Pac-Takahashi

链接: E - Pac-Takahashi

1. 题目描述

在这里插入图片描述

2. 思路分析

  • BFS+状压DP。学到了!

3. 代码实现

PROBLEM = """给两个字符串s和t,只含小写字母和'@'。
其中'@'可以替换成任意'atcoder'几个字符中的一个。
开始前,你可以重排t。问是否能使s和t完全相同。
"""
"""计数每个字符,计算差异。最终看看差异的字符能否用对方行的'@'补回来即可。
"""
PROBLEM = """给一个m行n列的矩阵,其中矩阵的每个位置:
'S' 代表起始位置
'G' 代表目标位置
'#' 代表墙
'.' 代表路
'o' 代表这个位置有糖果。题目保证最多有18个糖果。
1<=m,n<=300。
问在t步内,是否能到达终点。若能,最多能收集多少个糖果。
"""
"""据说是两个非常裸的典拼到一起。但第二个我真不会,这次算学学。
- 注意到糖果最多只有18个,考虑18次bfs/状态压缩。
- 然而这题这两步都要做。
- 容易想到,从起始位置尝试经过1个糖果,再去下一个糖果..最终到达目标位置。
- 这样就要先计算出每个糖果到彼此的距离,以及到终点的距离。
1. 把(所有糖果+起始位置)它们互相之间的距离都计算出来,这个可以算20次最短路。(朴素bfs即可,因为权是1.
2. 对这20个位置状压,进行一个状压DP
    - 定义:f[mask][j]代表在状态mask下,最终到达j点的最短步数。其中mask第i为是1代表去过i位置。
    - 转移:从小到大刷表,每次对mask的每一个1,尝试从这个1(第j位)到达一个不在mask中的位置k,则可以更新mask|k的状态为f[mask][j] + dis[j][k]
    - 初始:令第0位是起始,第1位是终点,那么f[1][0]=0,即访问过0位置,且在0位置需要的步数为0.
    - 答案:对每个状态,若它终点为1的步数<=t,则可以尝试这个方案,mask.bit_count()-2,因为有2个位置是起始结束。
"""


#       ms
def solve():
    m, n, t = RI()
    g = []
    cnt = 2
    cc = {}
    for i in range(m):
        s, = RS()
        g.append(s)
        for j, c in enumerate(s):
            if c == 'S':
                sx, sy = i, j
            elif c == 'G':
                gx, gy = i, j
            elif c == 'o':
                cc[(i, j)] = cnt
                cnt += 1
    cc[(sx, sy)] = 0
    cc[(gx, gy)] = 1
    dis = [[inf] * cnt for _ in range(cnt)]

    # print(1)
    def inside(x, y):
        return 0 <= x < m and 0 <= y < n and g[x][y] != '#'

    def bfs(x, y):
        u = cc[x, y]
        dist = [[10**9] * n for _ in range(m)]
        dist[x][y] = 0
        q = deque([(x, y)])
        while q:
            # print(q)
            x, y = q.popleft()
            d = dist[x][y]
            if (x, y) in cc:
                v = cc[x, y]
                dis[u][v] = d
            d += 1
            for dx, dy in DIRS:
                a, b = x + dx, y + dy
                if inside(a, b) and dist[a][b] > d :
                    dist[a][b] = d
                    q.append((a, b))

    for x, y in cc:
        bfs(x, y)
    if dis[0][1] > t:
        return print(-1)
    # print(dis)
    # 有cnt个点,给出他们分别到达彼此的距离,问从0最终到1的每种方案的最短距离。
    f = [[10 ** 9] * (1 << cnt) for _ in range(cnt)]  # f[i][j] 代表在状态i最后位置是j需的步数
    f[0][1] = 0  # 一开始站在位置0上,这个状态是1。
    for i in range(1 << cnt):
        for j in range(cnt):  # i状态里有j这个点,尝试从j出发
            if i >> j & 1:
                for k in range(cnt):
                    if i >> k & 1: continue  # k不在i里,那么从j到k
                    f[k][i | (1 << k)] = min(f[k][i | (1 << k)], f[j][i] + dis[j][k])
    ans = 0
    for i in range(1 << cnt):
        if f[1][i] <= t:
            ans = max(ans, bin(i).count('1')-2)
    print(ans)

六、参考链接

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

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

相关文章

Azure描述云服务类型

Azure描述云服务类型 基础结构即服务&#xff08;IaaS&#xff09;共担责任模型方案 介绍平台即服务&#xff08;PaaS&#xff09;共担责任模型方案 描述软件即服务&#xff08;SaaS&#xff09;共担责任模型方案 描述责任共担模型知识检查题目 基础结构即服务&#xff08;IaaS…

pyqt实现文件批量操作

代码逻辑 https://download.csdn.net/download/Lynqwest/87783077 文件打包 一、安装UPX 在https://github.com/upx/upx/releases/tag/v3.96下载相关版本&#xff0c;该网址无法进入&#xff0c;可参考https://download.csdn.net/download/Lynqwest/87783084 下载后将 upx…

谓词逻辑与推理演算

谓词逻辑 辖域 变元的约束—换自由变元 不容易出错 枚举 前束范式 量词例子 全称量词 ( ∀ x ) 条件前件加入 → (\forall x) 条件前件加入 \to (∀x)条件前件加入→ 存在量词 ( ∃ x ) 和取式 ∧ (\exists x) 和取式 \wedge (∃x)和取式∧ ∀ x P ( x ) ⟺ ∃ x P ( x ) \…

Mac M2芯片免安装版mysql

文章目录 1、下载mysql安装包2、移动解压目录并授权3、初始化mysql4、启动mysql5、启动错误处理6、登录mysql7、重置mysql密码 1、下载mysql安装包 先看一下本机mac信息 左上角&#xff0c;单机苹果的logo&#xff0c;然后单击“关于本机”&#xff0c;可以看到当前mac的信息 …

【JAVA进阶】Set集合、Map集合

&#x1f4c3;个人主页&#xff1a;个人主页 &#x1f525;系列专栏&#xff1a;JAVASE基础 目录 一、Set系列集合 1.HashSet 2.LinkedHashSet 3.TreeSet 二、补充知识 1.可变参数 2.集合工具类Collections 三、Map集合体系 1.Map集合的概述 2.Map集合体系特点 3.Map…

mybatis plus自动生成代码(代码生成器)

参考 05_尚硅谷_搭建项目环境&#xff08;代码生成器&#xff09;_哔哩哔哩_bilibili 调用mp的AutoGenerator可以生成代码&#xff0c;就像java脚本一样&#xff0c;运行即可生成 要求代码生成器脚本不用会写&#xff0c;会修改其中条项生成我们预期的代码即可。 项目整体结构…

前端 之 FormData对象浅谈

一、简介 ​ 通常情况下&#xff0c;前端在使用post请求提交数据的时候&#xff0c;请求都是采用application/json 或 application/x-www-form-urlencoded编码类型&#xff0c;分别是借助JSON字符串来传递参数或者keyvalue格式字符串&#xff08;多参数通过&进行连接&…

mediasoup Transport端口策略

一. 前言 mediasoup 支持多种类型的 Transport&#xff0c;有 WebRtcTransport&#xff0c;PlainTransport 以及 PipeTransport&#xff0c;对于 WebRtcTransport 目前 mediasoup 最新版本已经支持多个 WebRtcTransport 共用单个端口的模式了&#xff0c;而在此之前每个 WebRtc…

真题详解(补码转换)-软件设计(七十四)

真题详解(索引查询)-软件设计&#xff08;七十三)https://blog.csdn.net/ke1ying/article/details/130659024 Composite模式&#xff1a; 以树形结构来表示”整体-部分”的关系&#xff0c;使得单个和团体的使用都具有一致性。 对一个基本有序的数组进行排序&#xff0c;适合…

【PCIE体系结构九】物理层的基本逻辑框架

&#x1f449;个人主页&#xff1a;highman110 &#x1f449;作者简介&#xff1a;一名硬件工程师&#xff0c;持续学习&#xff0c;不断记录&#xff0c;保持思考&#xff0c;输出干货内容 参考书籍&#xff1a;《深入浅出SSD&#xff1a;固态存储核心技术、原理与实战》 物…

可见光遥感图像目标检测(三)文字场景检测之Arbitrary

前言 前面介绍了关于可见光遥感图像目标检测任务主要面临的问题&#xff0c;现在对旋转目标的问题进行优化&#xff0c;为了便于大家理解与之前通用目标检测区别&#xff0c;采用Faster-Rcnn网络模型的架构对旋转目标的检测进行改进。 本教程禁止转载。同时&#xff0c;本教程来…

5G-NR非连续接收DRX参数配置详解

5G-NR系统配置中的非连续接收系统 DRX&#xff1a;Discontinuous Reception 5G终端商用在即&#xff0c;根据前期测试及部分5G友好用户反馈&#xff0c;“5G终端功耗大&#xff0c;待机差”问题特别突出。根据5G技术特性&#xff0c;导致5G终端相比4G功耗大很多的原因有如下4…

干货 | Amos实操教程之中介效应检验

Hello&#xff0c;大家好&#xff01; 这里是壹脑云科研圈&#xff0c;我是喵君姐姐~ 本次推文&#xff0c;我们就来给大家介绍一种处理结构方程模型软件——Amos 。 01 摘要 Amos是什么&#xff1f; Amos由James L. Arbuckle所发展&#xff0c;全名是Analysis of Moment S…

泛化深度学习综述

机器学习系统通常假设训练和测试分布是相同的。为此&#xff0c;一个关键的需求是开发可以推广到unseen分布的模型。领域泛化&#xff08;DG&#xff0c;Domain generalization&#xff09;&#xff0c;即分布外泛化&#xff08;out-of-distribution generalization&#xff09…

vim强大的快捷键

文章目录 vim强大的快捷键&#xff08;必须在可视模式下完成&#xff09;光标移动&#xff08;上下左右移动&#xff09;行选中列选中复制粘贴剪切删除取消后悔取消跳到文件的末尾跳转到我呢见的开头保存并且退出vim编辑器自动补全自动格式化回到行首&#xff08;这一行的第一个…

ESP32设备驱动-MMA8452加速度计驱动

MMA8452加速度计驱动 文章目录 MMA8452加速度计驱动2、硬件准备3、软件准备4、驱动实现MMA8452Q 是一款智能、低功耗、三轴、电容式微加工加速度计,具有 12 位分辨率。 该加速度计具有嵌入式功能,具有灵活的用户可编程选项,可配置为两个中断引脚。 嵌入式中断功能可实现整体…

DJ5-2 差错检测和纠错

目录 一、差错检测和纠错技术 1、发送节点 2、接收节点 3、说明 二、差错检测技术 1、一比特奇偶校验 2、二维奇偶校验 3、Internet 校验和方法&#xff08;复习&#xff09; 4、循环冗余检测 CRC 5、差错检测方法比较 一、差错检测和纠错技术 链路层提供比特级差错检…

我为什么要使用vuetify3做为基础组件去开发公司组件库

设计风格 Vuetify是基于Material Design规范&#xff0c;依靠Material Design的设计优势&#xff0c;在无需编写一行css代码就可以得到非常美观的界面功能&#xff0c;同时Vuetify还具备自适应的能力&#xff0c;可以使用一套代码写出同时兼容手机、平板、web的功能&#xff1…

如何在Simulink中使用可变电阻-可变电容-可变电感

1. 原由 前期文章提出了Simulink如何在线修改&#xff08;动态修改&#xff09;模块参数的方法&#xff0c;并提供原创的Dynamic Change Parameter模块&#xff08;简称DCP模块&#xff09;&#xff0c;模块得到了许多朋友的使用。最近收到几位朋友反馈&#xff0c;他们使用DCP…

VGG网络原理与搭建

VGG网络原理与搭建 VGG在2014年由牛津大学著名研究组VGG&#xff08;Visual Geometry Group&#xff09;提出&#xff0c;斩获该年ImageNet竞赛中Localization Task&#xff08;定位任务&#xff09;第一名和Classification Task&#xff08;分类任务&#xff09;第二名。 论文…