[abc复盘] abc319 20230909

news2024/11/24 18:31:23

[abc复盘] abc319 20230909

    • 总结
    • A - Legendary Players
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • B - Measure
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • C - False Hope
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • D - Minimum Width
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • E - Bus Stops
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • F - Fighter Takahashi
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 六、参考链接

总结

  • 高光时刻,竟然做出了F,可惜C和E没出,否则上大分。这场过F竟然比G人还少。
  • A 打表
  • B 模拟,题意瞎写
  • C 期望题,全排列
  • D 二分答案
  • E LCM二维DP
  • F 堆贪心+状压枚举
    在这里插入图片描述

A - Legendary Players

链接: A - Legendary Players

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 让打印每个人的分,打表。

3. 代码实现

def solve():
    s, = RS()
    p = {'tourist': 3858,
         'ksun48': 3679,
         'Benq': 3658,
         'Um_nik': 3648,
         'apiad': 3638,
         'Stonefeang': 3630,
         'ecnerwala': 3613,
         'mnbvmar': 3555,
         'newbiedmy': 3516,
         'semiexp': 3481,

         }
    print(p[s])

B - Measure

链接: B - Measure

1. 题目描述

在这里插入图片描述

2. 思路分析

按题意模拟

3. 代码实现

PROBLEM = """给定一个正整数N。打印一个长度为(N+1)的字符串,定义如下。

对于每个i=0,1,2,…,N,

如果存在一个在1和9之间的N的因子j,并且i是N/j的倍数,则si是对应最小的j的数字(si将是1,2,...,9中的一个);
如果不存在这样的j,则si为-。
"""



#       ms
def solve():
    n, = RI()
    ans = []
    for i in range(n+1):
        for j in range(1,10):
            if n%j == 0 and i%(n//j) == 0:
                ans.append(str(j))
                break
        else:
            ans.append('-')
    print(''.join(ans))

C - False Hope

链接: C - False Hope

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 以后看到期望考虑一下全集的数量,可行的话其实枚举。
  • 9的全排列其实只有36w。

3. 代码实现

PROBLEM = """有一个3×3的方格,每个方格内写着介于1和9之间(包括1和9)的数字。第i行从顶部开始,第j列从左边开始(1≤i≤3,1≤j≤3)的方格包含数字ci,j。

同一个数字可能写在不同的方格中,但不能在垂直、水平或对角线方向上连续出现三个方格。更确切地说,保证ci,j满足以下所有条件。

对于任意1≤i≤3,不满足ci,1=ci,2=ci,3。
对于任意1≤j≤3,不满足c1,j=c2,j=c3,j。
不满足c1,1=c2,2=c3,3。
不满足c3,1=c2,2=c1,3。
高桥将以随机顺序看到每个方格中的数字。当存在一条线(垂直、水平或对角线),满足以下条件时,他会感到失望。

他看到的前两个方格包含相同的数字,但最后一个方格包含不同的数字。
计算高桥在没有失望的情况下看到所有方格中数字的概率。

约束条件
ci,j∈{1,2,3,4,5,6,7,8,9} (1≤i≤3,1≤j≤3)
对于任意1≤i≤3,不满足ci,1=ci,2=ci,3。
对于任意1≤j≤3,不满足c1,j=c2,j=c3,j。
不满足c1,1=c2,2=c3,3。
不满足c3,1=c2,2=c1,3。
"""
"""听木木老师的:枚举9个数的排列 只有362880种,然后这9个数的排列中,不能有前两个数相同的行是按aab顺序排列的
用bad储存所有这种的线:包括三行三列、两条对角线,每条线最多只有两种方法进bad,因此bad最多只有16个元素(case2就是这种数据)

所以,总复杂度是362880*9*16=52254720
"""


#  527     ms
def solve():
    g = []
    for _ in range(3):
        g.append(RILST())
    bad = []  # 失望顺序
    for x, y, z in (0, 1, 2), (3, 4, 5), (6, 7, 8), (0, 3, 6), (1, 4, 7), (2, 5, 8), (0, 4, 8), (2, 4, 6):
        for x, y, z in permutations((x, y, z)):
            if g[x // 3][x % 3] == g[y // 3][y % 3]:
                bad.append((x, y, z))
    # print(bad)
    # print(len(bad))
    p = 0  # 会失望的排列方法
    for q in permutations(range(9)):
        for x, y, z in bad:
            if q.index(x) < q.index(y) < q.index(z):  # 不能有这个顺序,有就寄
                p += 1
                break

    print(1 - p / perm(9))

D - Minimum Width

链接: D - Minimum Width

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 字符串就那么多,显然窗口越宽,高度越小。容易发现是单调的。
  • 那么就可以二分。
  • 知道宽度的话,模拟求高度是否超过m是可行的

3. 代码实现

PROBLEM = """问题陈述
Takahashi在一个窗口中显示了一个有N个单词的句子。所有单词的高度相同,第i个单词(1≤i≤N)的宽度为Li。

这些单词在窗口中以一个宽度为1的空格分隔开。更具体地说,当句子在宽度为W的窗口中显示时,满足以下条件。

句子被分成几行。
第一个单词显示在顶行的开头。
第i个单词(2≤i≤N)要么在第(i-1)个单词之后有一个宽度为1的间隙,要么显示在包含第(i-1)个单词的行的下一行的开头。它不会在其他地方显示。
每行的宽度不超过W。这里,一行的宽度是指从最左边的单词的左端到最右边的单词的右端的距离。
当Takahashi将句子显示在窗口中时,句子适合M行或更少。找出窗口的最小可能宽度。
"""


def lower_bound(lo: int, hi: int, key):
    """由于3.10才能用key参数,因此自己实现一个。
    :param lo: 二分的左边界(闭区间)
    :param hi: 二分的右边界(闭区间)
    :param key: key(mid)判断当前枚举的mid是否应该划分到右半部分。
    :return: 右半部分第一个位置。若不存在True则返回hi+1。
    虽然实现是开区间写法,但为了思考简单,接口以[左闭,右闭]方式放出。
    """
    lo -= 1  # 开区间(lo,hi)
    hi += 1
    while lo + 1 < hi:  # 区间不为空
        mid = (lo + hi) >> 1  # py不担心溢出,实测py自己不会优化除2,手动写右移
        if key(mid):  # is_right则右边界向里移动,目标区间剩余(lo,mid)
            hi = mid
        else:  # is_left则左边界向里移动,剩余(mid,hi)
            lo = mid
    return hi


#       ms
def solve():
    n, m = RI()
    a = RILST()

    def ok(x):
        p = 0
        c = 1
        for v in a:
            if p == 0:
                p += v
            else:
                p += v + 1
                if p > x:
                    c += 1
                    p = v
                    if c > m:
                        return False
        return True

    print(lower_bound(max(a), sum(a) + n - 1, ok))

E - Bus Stops

链接: E - Bus Stops

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 由于可以取模,关键的点应该可以容纳所有站台的信息,那么就是所有需求的lcm,其实只有840。
  • 这样就可以转移了。

3. 代码实现


#    482   ms
def solve():
    n, x, y = RI()
    pt = []
    ll = 1
    for _ in range(n - 1):
        pt.append(RILST())
        ll = lcm(ll, pt[-1][0])
    f = [0] * ll  # f[i][j]到0时间模ll为j时,从0到达i的时间
    for p, t in pt:
        for j in range(ll):
            f[j] = f[j] + t + (p - f[j] - j) % p  # 到达上一步的实际是时间是f[j]+j,那么要等待(p - f[j] - j) % p

    q, = RI()
    for _ in range(q):
        qi, = RI()
        print(qi + x + f[(qi + x) % ll] + y)  # 到达0的时间是qi+x


#   1178    ms
def solve1():
    n, x, y = RI()
    pt = []
    ll = 1
    for _ in range(n - 1):
        pt.append(RILST())
        ll = lcm(ll, pt[-1][0])
    f = [[0] * ll for _ in range(n)]  # f[i][j]到0时间模ll为j时,从0到达i的时间
    for i, (p, t) in enumerate(pt, start=1):
        for j in range(ll):
            f[i][j] = f[i - 1][j] + t + (p - f[i - 1][j] - j) % p
    q, = RI()
    for _ in range(q):
        qi, = RI()
        print(qi + x + f[-1][(qi + x) % ll] + y)

F - Fighter Takahashi

链接: F - Fighter Takahashi

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 第一反应是堆贪心。
  • 发现吃药是乘法,一定晚点搞,打不过怪了再吃药。
  • 剩下的就是实现,只有10个药,可以暴力枚举组合。
  • 根本不需要用哈夫曼编码

3. 代码实现

PROBLEM = """有一棵具有N个顶点的树。第一个顶点是根节点,第i个顶点(2≤i≤N)的父节点是pi(1≤pi<i)。

每个非根节点上都有一个敌人或药物。高桥想要打败所有的敌人。初始时,他的力量为1,他位于第一个顶点。对于i=2,…,N,第i个顶点的信息由三个整数(ti,si,gi)表示,如下所示。

如果ti=1,表示第i个顶点上有一个敌人。当高桥第一次访问这个顶点时,如果他的力量小于si,高桥被敌人打败并输掉比赛,之后他不能移动到其他顶点。否则,他打败敌人,他的力量增加gi。

如果ti=2,表示第i个顶点上有一种药物。当高桥第一次访问这个顶点时,他服用了这种药物,他的力量乘以gi。(对于一个带有药物的顶点,si=0。)

最多有10个带有药物的顶点。

高桥可以重复移动到相邻的顶点。确定他是否能够打败所有的敌人。
"""
"""由于吃药是乘一个>=1的数,因此一定放在加法后边更好,越滞后越好。
因此优先打怪,用小顶堆优先打弱的怪。打不过了再去吃药。
每次吃药枚举最小的但满足打赢怪的组合。可以直接暴力枚举
"""

#       ms
def solve():
    n, = RI()
    pw = 1  # 初始力量
    g = [[] for _ in range(n)]
    ee = [(1, 0, 0)]  # 根视为100
    for i in range(1, n):
        p, t, s, gg = RI()
        g[p - 1].append(i)
        ee.append((t, s, gg))

    yao = []  # 现在可用的药

    def viagra(pw, t):  # 从现在能访问的药里,找到最小的组合,使pw*s>=t,直接状压枚举
        if not yao:
            return 0
        ans = mn = inf  # 组合、最小乘积
        n = len(yao)
        for i in range(1, 1 << n):  # 状压
            s = 1  # 这个组合的乘积
            for j in range(n):
                if i >> j & 1:
                    s *= yao[j]
                    if s > mn:  # 超过当前了不用看了
                        break
            if s * pw >= t and s < mn:  # 能打过怪了
                mn = s
                ans = i
        if ans == inf:  # 没有能打过怪的组合,直接死
            return 0
        for j in range(n - 1, -1, -1):  # 用掉这些药,逆序
            if ans >> j & 1:
                yao.pop(j)
        return mn

    h = [(0, 0)]  # 小顶堆,优先搞最弱的怪,如果搞不动,才去吃药,每次吃(最小但满足的组合)
    while h:
        t, u = heappop(h)
        if ee[u][0] == 2:
            yao.append(ee[u][2])
        if pw < t:  # 需要吃药
            pw *= viagra(pw, t)  # 吃
        if pw < t:  # 吃完药还是打不过
            return print('No')
        if ee[u][0] == 1:
            pw += ee[u][2]
        for v in g[u]:
            heappush(h, (ee[v][1], v))  # 如果是药,优先加入药袋,正好它的s是0

    print('Yes')

六、参考链接

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

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

相关文章

k8s pod概念、分类及策略

目录 一.pod相关概念 &#xff12;.Kubrenetes集群中Pod两种使用方式 &#xff13;.pause容器的Pod中的所有容器共享的资源 &#xff14;.kubernetes中的pause容器主要为每个容器提供功能&#xff1a; &#xff16;.Pod分为两类&#xff1a; 二.Pod容器的分类 1.基础容器…

第P5周—运动鞋识别

一、前期工作 1.导入数据集 数据集&#xff1a;工作台 - Heywhale.com import torch import matplotlib.pyplot as plt from torchvision import transforms, datasets import os, PIL, random, pathlibdata_dir rD:\P5-data\test data_dir pathlib.Path(data_dir)data_pa…

进程退出、孤儿进程、僵尸进程

进程退出 子进程退出&#xff0c;有些资源需要父进程去释放 /*#include <stdlib.h>void exit(int status);#include <unistd.h>void _exit(int status);status参数&#xff1a; 进程退出的一个状态信息。父进程回收资源的时候可以获取 */#include <stdlib.h>…

【C++】使用红黑树进行封装map和set

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

【IEEE 13 节点分配系统中的THD降低】系统的谐波分析给出了各种总线上电流和电压的谐波频谱和THD(Simulink实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

phantomjs插件---实现通过链接生成网页截图

Phantomjs | PhantomJS 配置要求 windows下&#xff0c;安装完成phantomJS 设置phantomjs环境变量【也可直接使用phantomjs目录下的执行文件】 直接通过访问php文件执行/通过cmd命令行执行【phantomjs phantom_script.js】 linux下,安装完成phantomJS 设置phantomjs环境变量 直…

模拟实现链式二叉树及其结构学习——【数据结构】

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 之前我们实现了用顺序表完成二叉树(也就是堆)&#xff0c;顺序二叉树的实际作用就是解决堆排序以及Topk问题。 今天我们要学习的内容是链式二叉树&#xff0c;并且实现链式二叉树&#xff0c;这篇博客与递归息息相关&a…

前端JavaScript中requestAnimationFrame:优化动画和渲染的利器

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 引言 1. requestAnimationFrame简介 2. requestAnimationFrame的属性 3. requestAnimationFrame的应用场景 3.1…

在Copernicus Data Space Ecosystem下载Sentinel数据及使用脚本检索和下载数据

文章目录 1.前言2.Copernicus Data Space Ecosystem使用介绍3.使用脚本检索和下载Sentinel数据4.最后 建了一个QQ群&#xff0c;大家可以在里边聊聊水色遥感数据下载和数据处理方面的事情&#xff1a;1087024529 1.前言 最近使用Sentinelsat库在Copernicus Open Access Hub下载…

线性代数的本质(三)——线性方程组

文章目录 线性方程组高斯消元法初等行变换线性方程组的解向量方程齐次线性方程组的解非齐次线性方程组的解 线性方程组 高斯消元法 客观世界最简单的数量关系是均匀变化的关系。在均匀变化问题中&#xff0c;列出的方程组是一次方程组&#xff0c;我们称之为线性方程组(Linea…

语音识别算法设计-基于MFCC+DTW算法-Matlab+C代码版本

语音识别算法设计-基于MFCCDTW算法-MatlabC代码&#xff08;全定点加速&#xff09;版本 语音识别算法主要涉及特征提取、统计建模和识别技术等几个关键方面。在此使用MFCCDTW算法的方式给出语音识别的代码&#xff0c;首先进行简单介绍。 Matlab版本代码地址&#xff1a;http…

基于STC15单片机温度光照检测系统-proteus仿真-源程序

一、系统方案 1、本设计采用STC15单片机作为主控器。 2、光敏电阻采集光照值送到液晶1602和串口显示。 3、DS18B20采集温度值&#xff0c;送到液晶1602和串口显示。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 /-----------------------…

Vector 模拟实现

前言 本文将会向您介绍如何模拟实现vector 引入 Vector是一种动态数组&#xff0c;也是C标准库中的容器之一。它提供了一种存储和操作一系列元素的方式&#xff0c;类似于数组&#xff0c;但具有更多的功能和灵活性。 Vector可以存储不同类型的元素&#xff0c;并且可以根据…

关于老项目从JDK8升级到JDK17所需要注意的细节

文章目录 ☀️1.关于老项目从JDK8升级到JDK17所需要注意的细节&#x1f338;1.1.更新JDK&#x1f338;1.2.修改Idea中的JDK版本&#x1f338;1.3.关于修改过程中遇到的异常&#x1f338;1.4.IDEA工具栏操作Maven正常&#xff0c;但使用mvn命令运行就报错 ☀️1.关于老项目从JDK…

烧结金属材料和硬质合金弹性模量的测定

声明 本文是学习GB-T 5166-2023 烧结金属材料和硬质合金弹性模量的测定. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件描述了烧结金属材料和硬质合金弹性模量的测定方法。 本文件适用于采用纵向振动法测定烧结金属材料和硬质合金的动…

Windows 10任务栏点不动了,右下角wifi、音量也都消失了,只剩下个时间

Windows 10任务栏点不动了&#xff0c;右下角wifi、音量也都消失了&#xff0c;只剩下个时间 解决方法图例如下 解决方法 快捷键Ctrlaltdelete&#xff0c;选择任务管理器打开&#xff0c;选择“文件”-“运行新任务”&#xff1a;就会打开运行窗口&#xff0c;输入&#xff1…

动态规划:子序列问题(C++)

动态规划&#xff1a;子序列问题 前言子序列问题1.最长递增子序列&#xff08;中等&#xff09;2.摆动序列&#xff08;中等&#xff09;3.最长递增子序列的个数&#xff08;中等&#xff09;4.最长数对链&#xff08;中等&#xff09;5.最长定差子序列&#xff08;中等&#x…

SQL优化--排序优化(order by)

Using filesort : 通过表的索引或全表扫描&#xff0c;读取满足条件的数据行&#xff0c;然后在排序缓冲区sort buffer中完成排序操作&#xff0c;所有不是通过索引直接返回排序结果的排序都叫 FileSort 排序。 Using index : 通过有序索引顺序扫描直接返回有序数据&#xff0c…

linux驱动开发day6--(epoll实现IO多路复用、信号驱动IO、设备树以及节点和属性解析相关API使用)

一、IO多路复用--epoll实现 1.核心&#xff1a; 红黑树、一张表以及三个接口、 2.实现过程及API 1&#xff09;创建epoll句柄/创建红黑树根节点 int epfdepoll_create(int size--无意义&#xff0c;>0即可)----------成功&#xff1a;返回根节点对应文件描述符&#xf…

计算机二级python基础题刷题笔记(二)

1、等比数列 1、获得用户输入的以逗号分隔的三个数字&#xff0c;记为a,b,c,以a为起始数值&#xff0c;b为前后相邻数的比值&#xff0c;c为数列长度 &#xff0c;产生一个等比数列&#xff0c;将这个数列以逗号分隔的形式输出&#xff0c;最后一个元素输出后无逗号 等比数列公…