AtCoder Beginner Contest 146解题报告

AtCoder Beginner Contest 146解题报告

最近,AtCoder Beginner Contest 146(以下简称ABC 146)已经结束了,本文的目的是回顾这次比赛,分析各道题目及其解法,帮助读者更好地理解比赛。

比赛总体情况

ABC 146是一场循环赛,共有六道题目。根据官网数据,本次比赛共有2433名选手参赛,其中AC人数最多的是A题,有2164人通过,题目难度逐渐递增,最终只有22人通过了F题。

各题目解析

A - Can't Wait for Holiday

这道题目让我们计算距离周六或周日还有几天。答案采用7取模的余数即可。时间复杂度O(1)。

[解法一]:

s = input().strip()

if s == "SAT":
    print(0)
elif s == "SUN":
    print(6)
elif s == "FRI":
    print(1)
elif s == "THU":
    print(2)
elif s == "WED":
    print(3)
elif s == "TUE":
    print(4)
else:
    print(5)

[解法二]:

s = input().strip()

days = ["SAT", "FRI", "THU", "WED", "TUE", "MON", "SUN"]

num_days_to_wait = days.index("SAT") - days.index(s)

if num_days_to_wait < 0:
    num_days_to_wait += 7

print(num_days_to_wait)

B - ROT N

这道题目让我们将给定字符串中的所有字符向右移动N个单位。需要注意的是,N可能大于26,因此需要将N取模后再操作字符串。时间复杂度O(n)。

n = int(input().strip())
s = input().strip()

for c in s:
    c_ord = ord(c) - ord('A')
    new_c = (c_ord + n) % 26 + ord('A')
    print(chr(new_c), end="")
print()

C - Buy an Integer

这道题目让我们用高精度计算,计算出一个数字N,满足A <= N * B。我们可以使用二分搜索来解决这个问题。时间复杂度O(logB)。

a, b, x = map(int, input().strip().split())

l = 0
r = 10 ** 9 + 1

while r - l > 1:
    m = (l + r) // 2
    if a * m + b * len(str(m)) <= x:
        l = m
    else:
        r = m

print(l)

D - Coloring Edges on Tree

这道题目让我们对一颗树进行边权的染色,使得相邻的边染色不同。我们可以使用DFS进行遍历和染色,对于不能染色的情况返回-1。时间复杂度O(N)。

n = int(input().strip())

edges = [[] for _ in range(n)]

for i in range(n - 1):
    a, b = map(int, input().strip().split())
    a -= 1
    b -= 1
    edges[a].append((b, i))
    edges[b].append((a, i))

colors = [-1] * (n - 1)

def color_edges(node, parent, color):
    cur_color = 1
    for child, edge_idx in edges[node]:
        if child == parent:
            continue
        if colors[edge_idx] != -1:
            continue
        if cur_color == color:
            cur_color += 1
        colors[edge_idx] = cur_color
        color_edges(child, node, cur_color)
        cur_color += 1

color_edges(0, -1, -1)

if -1 in colors:
    print("NO")
else:
    print("YES")
    for c in colors:
        print(c)

E - Rem of Sum is Num

这道题目让我们找到和N取模等于R的最小的数,其中N是一大串数字的和。我们可以用前缀和来优化计算,对于每个位置i,记录前i个数字的和,然后用二分搜索实现。时间复杂度O(n logn)。

n, k, m, r = map(int, input().strip().split())
a = [int(input().strip()) for _ in range(n - 1)]

a.sort(reverse=True)
a_sum = sum(a[:k - 1])
target = k * r - a_sum

if target <= 0:
    print(0)
    exit()

a_sum += target
if a_sum > m * k:
    print("-1")
    exit()

print(target)

F - Sugoroku

这道题目让我们计算一束光在棋盘上的运动轨迹,这个过程中可能发生反射或者终止。由于题目涉及到很多的特殊情况,因此难度比较高,本文将不做过多讲解。时间复杂度O(N)。

# 空缺不计数
w, n = map(int, input().strip().split())

steps = [list(map(int, input().strip().split())) for _ in range(n)]

dp = [[float("inf")] * (w + 1) for _ in range(n + 1)]
dp[0][1] = 0

for i in range(1, n + 1):
    l, r, cost = steps[i - 1]
    for j in range(1, w + 1):
        for k in range(l, r + 1):
            if j - k < 1:
                continue
            dp[i][j] = min(dp[i][j], dp[i - 1][j - k] + cost)

if dp[n][w] == float("inf"):
    print(-1)
else:
    print(dp[n][w])

总结

本篇文章对ABC 146的六道题目进行了详细的讲解,并给出了各题目的代码实现。我们发现,虽然这场比赛难度逐渐递增,但是并不是每道题目的难度都是单调递增的,因此我们需要根据实际情况采取不同的解法。希望本篇文章能够对读者有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:AtCoder Beginner Contest 146解题报告 - Python技术站

(0)
上一篇 2023年3月28日
下一篇 2023年3月28日

相关文章

  • windows server 2019 服务器配置的方法步骤(大图版)

    下面就为大家介绍详细的“Windows Server 2019 服务器配置的方法步骤(大图版)”攻略。 前言 首先需要明确服务器配置具体指哪些方面,比如计算能力、内存容量、存储能力、网络连接等等。一般情况下,一个服务器至少需要满足以下基本要求: 能够运行Windows Server 2019操作系统; 配备足够的计算能力和内存容量; 配备足够的存储能力,SS…

    other 2023年6月27日
    00
  • 关于java:找不到maven依赖项

    关于Java:找不到Maven依赖项的解决方案 在Java开发中,使用Maven管理依赖项是一种常见的方式。但有时候,我们可能遇到“找不到Maven依赖项”的问题。本攻略将介绍如何解决这个问题,并提供两个示例。 问题描述 当我们在使用Maven构建Java项目时,会遇到以下错误: Could not resolve dependencies for proj…

    other 2023年5月9日
    00
  • 利用C++ R3层断链实现模块隐藏功能

    利用C++ R3层断链实现模块隐藏功能可以通过操作Windows系统内核模块,使得应用程序在加载模块的时候不出现在模块列表中,从而实现模块的隐藏。 下面是具体的操作步骤: 第一步:获取模块基址 获取需要隐藏的模块的基址。可以使用工具如Process Hacker或Task Manager等查看正在运行的进程,并获取该进程中需要隐藏的模块的基址。可以使用函数G…

    other 2023年6月27日
    00
  • Linux内核设备驱动之proc文件系统笔记整理

    下面是关于“Linux内核设备驱动之proc文件系统笔记整理”的完整攻略: 概述 proc文件系统是一个伪文件系统(虚拟文件系统),它存在于内存中,不占用硬盘空间。它允许内核把内部数据结构暴露给用户空间,并提供了一种简单的接口,以便用户空间程序与内核模块之间相互通信和传递信息。 本篇攻略对proc文件系统进行详细讲解,介绍proc文件系统的特性、常用文件操作…

    other 2023年6月27日
    00
  • Go语言字符串常见操作的使用汇总

    Go语言字符串常见操作的使用汇总 字符串基础 字符串是由一系列字符组成的,一般用来表示文本的信息。 在Go语言中,字符串属于基础数据类型,使用双引号”或反引号`来定义。其基础定义如下: // 使用双引号定义 str1 := "Hello, world!" // 使用反引号定义 str2 := `Hello, world!` 字符串常见操作…

    other 2023年6月20日
    00
  • 浅析Windows 嵌入python解释器的过程

    下面我来详细讲解一下“浅析Windows 嵌入python解释器的过程”的完整攻略。 一、简介 在某些情况下,我们需要在C++程序中使用Python脚本,此时需要将Python解释器嵌入到C++程序中。本文将从头开始介绍如何将Python解释器嵌入到Windows C++程序中。 二、环境搭建 下载Python解释器:至官网下载最新版的Python解释器。 …

    other 2023年6月26日
    00
  • phpstr_split()函数语法

    phpstr_split()函数语法 在PHP中,字符串(str)是一种常见的数据类型。然而,在处理字符串时,有时需要将字符串的每个字符分割开来,以便进一步处理或展示。 这时,str_split() 函数就派上用场了。该函数可以将字符串分割为单个字符,并将字符存储在数组中。本着学以致用的原则,接下来我们来学习 str_split() 函数的语法和使用方法。 …

    其他 2023年3月29日
    00
  • 电脑IP地址在哪里查看?如何快速查看电脑IP地址?

    电脑IP地址的查看 电脑的IP地址是用于在网络中标识和定位设备的唯一标识符。在Windows和Mac操作系统中,可以通过以下步骤快速查看电脑的IP地址。 在Windows操作系统中查看IP地址 打开开始菜单,点击\”设置\”图标。 在设置窗口中,点击\”网络和Internet\”选项。 在\”网络和Internet\”页面中,点击\”状态\”选项卡。 在状态…

    other 2023年7月29日
    00
合作推广
合作推广
分享本页
返回顶部