AtCoder Beginner Contest 146解题报告

AtCoder Beginner Contest 146解题报告的完整攻略

AtCoder Beginner Contest 146是AtCoder举办的一场比赛,共有6道题目。本文将详细讲解AtCoder Beginner Contest 146解题报告的完整攻略,包括6道题目的解法和两个示例说明。

A - Can't Wait for Holiday

题目描述:给定一周中的某一天,计算距离下一个周六的天数。

解题思路:根据题意,可以先计算出当前是周几,然后计算距离下一个周六的天数。可以使用一个数组来存储一周中每一天的名称,然后使用循环查找当前是周几的索引,再计算距离下一个周六的天数。

days = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"]
today = input()
days_to_saturday = days.index("SAT") - days.index(today)
print(days_to_saturday if days_to_saturday >= 0 else days_to_saturday + 7)

B - ROT N

题目描述:给定一个字符串和一个整数N,将字符串中的每个字符向后移动N个位置。

解题思路:可以使用ASCII码来实现字符的移动。将字符转换为ASCII码,向后移动N个位置后再转换回字符即可。

n = int(input())
s = input()
result = ""
for c in s:
    ascii_code = ord(c)
    shifted_ascii_code = (ascii_code - ord("A") + n) % 26 + ord("A")
    result += chr(shifted_ascii_code)
print(result)

C - Buy an Integer

题目描述:给定三个整数A、B和X,计算满足A * N + B * d(N) <= X的最大的N。

解题思路:可以使用二分查找来实现。设N的取值范围为[1, X],则可以使用二分查找来查找满足条件的最大的N。在二分查找的过程中,需要计算d(N)的值。

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

def d(n):
    return len(str(n))

left = 0
right = x
while left <= right:
    mid = (left + right) // 2
    if a * mid + b * d(mid) <= x:
        left = mid + 1
    else:
        right = mid - 1
print(right)

D - Coloring Edges on Tree

题目描述:给定一棵树,将树的边染成两种颜色,使得相邻的边颜色不同。计算染色方案的数量。

解题思路:可以使用DFS来实现。对于每个节点,可以将其与父节点的边染成一种颜色,然后递归处理其子节点。对于每个节点,需要记录其与父节点的边的颜色,以避免相邻的边颜色相同。

import sys
sys.setrecursionlimit(10**7)

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

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

def dfs(v, p, c):
    k = 1
    for u, i in edges[v]:
        if u == p:
            continue
        if k == c:
            k += 1
        colors[i] = k
        dfs(u, v, k)
        k += 1

dfs(0, -1, -1)
print(max(colors))
for c in colors:
    print(c)

E - Rem of Sum is Num

题目描述:给定一个整数N和一个整数S,计算满足sum(d(N)) = S的最小的N。

解题思路:可以使用DP来实现。设dp[i][j]表示使用i位数字,数字和为j的最小的N。可以使用数位DP的思想来实现。

n, s = map(int, input().split())

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

for i in range(n):
    for j in range(s + 1):
        for k in range(10):
            if j - k >= 0:
                dp[i + 1][j] = min(dp[i + 1][j], dp[i][j - k] * 10 + k)

print(dp[n][s] if dp[n][s] != float("inf") else -1)

F - Sugoroku

题目描述:给定一个长度为N的数组A和一个整数K,每次可以将数组中的一个元素加上K或减去K,求将数组中所有元素变为0的最小操作次数。

解题思路:可以使用贪心算法来实现。首先将数组A排序,然后从中间位置开始,将左边的元素加上K,将右边的元素减去K,直到数组中所有元素都变为0。

n, k = map(int, input().split())
a = list(map(int, input().split()))

a.sort()
left = 0
right = n - 1
ans = float("inf")
while left <= right:
    mid = (left + right) // 2
    cnt = 0
    for i in range(mid + 1):
        if a[i] > 0:
            cnt += (a[i] - k - 1) // k + 1
    for i in range(mid + 1, n):
        if a[i] < 0:
            cnt += (-a[i] - k - 1) // k + 1
    if cnt <= mid:
        ans = min(ans, mid)
        right = mid - 1
    else:
        left = mid + 1

print(ans)

示例1:A - Can't Wait for Holiday

问题描述:给定一周中的某一天,计算距离下一个周六的天数。

输入:WED

输出:4

解释:当前是周三,距离下一个周六还有4天。

示例2:B - ROT N

问题描述:给定一个字符串和一个整数N,将字符串中的每个字符向后移动N个位置。

输入:

2
ABCXYZ

输出:

CDEZAB

解释:将字符串中的每个字符向后移动2个位置,得到CDEZAB。

总结

AtCoder Beginner Contest 146是AtCoder举办的一场比赛,共有6道题目。本文详细讲解了AtCoder Beginner Contest 146解题报告的完整攻略,包括6道题目的解法和两个示例说明。这些题目涵盖了不同的算法和数据结构,包括字符串处理、二分查找、贪心算法、DP等。通过学习这些题目,可以提高算法和数据结构的应用能力。

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

(0)
上一篇 2023年5月5日
下一篇 2023年5月5日

相关文章

  • iDempiere 使用指南 绿色版一键启动测试环境

    iDempiere 使用指南 绿色版一键启动测试环境 开发测试环境的设置是 iDempiere 实现数字化转型必不可少的一步。在使用 iDempiere 时,搭建一个安全可靠的测试环境是非常重要的。为了帮助 iDempiere 用户更加方便地搭建测试环境,我们发布了 iDempiere 使用指南 绿色版一键启动测试环境。 iDempiere 简介 iDemp…

    其他 2023年3月28日
    00
  • Java中初始化List集合的八种方式汇总

    Java中初始化List集合的八种方式汇总 在Java中,List是一种非常常用的集合类型。那么如何在Java中初始化List集合呢?这篇文章将为大家详细讲解Java中初始化List集合的八种方式。 1. 使用ArrayList List<String> list1 = new ArrayList<>(); list1.add(&qu…

    other 2023年6月20日
    00
  • 魔兽世界6.0法师如何堆属性 各属性优先级详解

    魔兽世界6.0法师如何堆属性 各属性优先级详解 概述 在魔兽世界6.0版本中,法师是一种强大的角色职业之一,通过正确堆积属性来提高输出是非常关键的。本攻略将详细介绍法师各种属性的优先级和堆叠方式,帮助玩家更好地进行属性选择和装备优化。 属性优先级详解 1. 智力(Intellect) 智力是法师最重要的属性,它直接影响法术伤害的强度。每一点智力会提供法术强度…

    other 2023年6月28日
    00
  • 简单说明CGI和动态请求是什么

    简单说明CGI和动态请求是什么 CGI是什么 CGI指的是通用网关接口(Common Gateway Interface),它是一种Web服务器与应用程序(通常是指脚本程序)进行交互的标准协议。通过CGI,Web服务器可以将用户请求转发到应用程序,应用程序再向Web服务器返回处理结果,Web服务器将结果响应给用户。 通常,CGI程序运行在Web服务器上,接收…

    其他 2023年3月28日
    00
  • svg 贝塞尔曲线图解(记录)

    下面是“SVG 贝塞尔曲线图解(记录)”的完整攻略,包括贝塞尔曲线的基本概念、贝塞尔曲线的类型、贝塞尔曲线的控制点和两个示例等方面。 贝塞尔曲线的基本概念 贝塞尔曲线是一种数学曲线,由法国数学家Pierre Bézier于20世纪50年代发明。贝塞尔曲线可以用于图形设计、计算机图形学、工程设计等领域。贝塞尔曲线由控制点和控制线组成,可以用于描述平滑曲线和曲面…

    other 2023年5月6日
    00
  • filezilla如何配置,filezilla服务器配置的方法图文教程

    下面我就为您详细讲解“filezilla如何配置,filezilla服务器配置的方法图文教程”。 filezilla如何配置 下载安装 首先,您需要从filezilla官方网站上下载并安装filezilla客户端软件。 连接 在软件界面中,点击“文件”-“站点管理器”,在弹出的对话框中点击“新建站点”按钮,填写服务器地址、用户名、密码等信息,点击“连接”按钮…

    other 2023年6月25日
    00
  • c#缓存详解

    C# 缓存详解 缓存是一种常见的性能优化技术,可以提高应用程序的响应速度和吞吐量。在 C# 中,缓存可以通过多种方式实现,包括内存缓存、分布式缓存和客户端缓存等。本文详细讲解 C# 缓存的实现方式和注意事项,并提供两个示例说明。 内存缓存 内存缓存是一种将数据存储在内存中的缓存方式,可以快速读取和写入数据。在 C# 中,可以使用 MemoryCache 类实…

    other 2023年5月9日
    00
  • python非递归全排列实现方法

    当我们需要对一个列表进行全排列时,通常会使用递归的方法,但是递归的深度随着列表长度的增加而增加,可能会导致栈溢出的问题。因此,我们可以使用非递归的方法实现列表的全排列。 下面是使用Python实现非递归全排列的完整攻略: 问题描述 给定一个列表nums,求出它的全排列。列表中元素不重复,且元素个数小于等于10。 示例输入:[1,2,3] 示例输出: [ [1…

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