[acwing周赛复盘] 第 60 场周赛20220716

news2025/7/14 8:04:54

[acwing周赛复盘] 第 60 场周赛20220716

    • 一、本周周赛总结
    • 二、 4722. 数列元素
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 三、4723. 队列
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 四、4724. 靓号
      • 1. 题目描述
      • 2. 思路分析
      • 3. 代码实现
    • 六、参考链接

一、本周周赛总结

  • 第一次打acwing,一共三题,难度跳跃挺大。
  • acwing python竟然不支持from math import comb,震惊!还得自己实现。
  • 在这里插入图片描述

在这里插入图片描述

二、 4722. 数列元素

链接: 4722. 数列元素

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 直接从1到n枚举,计算等比数列和即可。

3. 代码实现

import sys
from collections import *
from contextlib import redirect_stdout
from itertools import *
from math import sqrt
from array import *
from functools import lru_cache
import heapq
import bisect
import random
import io, os
from bisect import *

RI = lambda: map(int, sys.stdin.buffer.readline().split())
RS = lambda: map(bytes.decode, sys.stdin.buffer.readline().strip().split())
RILST = lambda: list(RI())
DEBUG = lambda x: sys.stderr.write(f'{str(x)}\n')

MOD = 10 ** 9 + 7




def main():
    n, = RI()
    for i in range(1,n+1):
        if i*(i+1)//2 == n:
            return print('YES')
    print('NO')


if __name__ == '__main__':
    # testcase 2个字段分别是input和output
    test_cases = (
        (
            """
1
""",
            """
YES
"""
        ),
        (
            """
2
""",
            """
NO
"""
        ),
        (
            """
3
""",
            """
YES
"""
        ),
    )
    if os.path.exists('test.test'):
        total_result = 'ok!'
        for i, (in_data, result) in enumerate(test_cases):
            result = result.strip()
            with io.StringIO(in_data.strip()) as buf_in:
                RI = lambda: map(int, buf_in.readline().split())
                RS = lambda: buf_in.readline().strip().split()
                with io.StringIO() as buf_out, redirect_stdout(buf_out):
                    main()
                    output = buf_out.getvalue().strip()
                if output == result:
                    print(f'case{i}, result={result}, output={output}, ---ok!')
                else:
                    print(f'case{i}, result={result}, output={output}, ---WA!---WA!---WA!')
                    total_result = '---WA!---WA!---WA!'
        print('\n', total_result)
    else:
        main()

三、4723. 队列

链接: 4723. 队列

1. 题目描述

在这里插入图片描述

2. 思路分析

  • 模拟一下可知,出队数据会被分成k个部分,第一部分有5个元素,第二部分是第一部分double:10个,第三部分20。。。
  • 我们让n依次减去这些部分,直到n无法构成下一个完整的部分。
  • 计算剩余的n在这个部分的哪个区域,区域的大小是x//5
  • 复杂度显然是开方的,因为是减去等差数列求和,这个和将以x方的速度增长到n。

3. 代码实现

import sys
from collections import *
from contextlib import redirect_stdout
from itertools import *
from math import sqrt
from array import *
from functools import lru_cache
import heapq
import bisect
import random
import io, os
from bisect import *

RI = lambda: map(int, sys.stdin.buffer.readline().split())
RS = lambda: map(bytes.decode, sys.stdin.buffer.readline().strip().split())
RILST = lambda: list(RI())
DEBUG = lambda x: sys.stderr.write(f'{str(x)}\n')
MOD = 10 ** 9 + 7


#    	 ms
def solve(n):
    a = 'abcde'
    if n <= 5:
        return print(a[n-1])
    x = 5
    while n > x:
        n -= x
        x *= 2
    if n == 0:
        return print('e')

    y = (n-1) // (x // 5)
    print(a[y])






def main():
    n, = RI()
    solve(n)


if __name__ == '__main__':
    # testcase 2个字段分别是input和output
    test_cases = (
        (
            """
1
""",
            """
a
"""
        ),
        (
            """
8
""",
            """
a
"""
        ),
    )
    if os.path.exists('test.test'):
        total_result = 'ok!'
        for i, (in_data, result) in enumerate(test_cases):
            result = result.strip()
            with io.StringIO(in_data.strip()) as buf_in:
                RI = lambda: map(int, buf_in.readline().split())
                RS = lambda: buf_in.readline().strip().split()
                with io.StringIO() as buf_out, redirect_stdout(buf_out):
                    main()
                    output = buf_out.getvalue().strip()
                if output == result:
                    print(f'case{i}, result={result}, output={output}, ---ok!')
                else:
                    print(f'case{i}, result={result}, output={output}, ---WA!---WA!---WA!')
                    total_result = '---WA!---WA!---WA!'
        print('\n', total_result)
    else:
        main()

四、4724. 靓号

链接: 4724. 靓号

1. 题目描述

在这里插入图片描述

2. 思路分析

二分然后构造答案

  • 先计数找出最多的那个数的次数,记为mx,如果mx>=k,则直接返回不用花费任何。
  • 我们定义calc(x)为花费x及以上是否能改成靓号,显然这个是具有单调性的,可以二分一下,求出最小x。
  • calc的实现可以枚举i∈{0-9},尝试把其它数字改成i,这里贪心一下,由于花费是两数之差,因此顺序一定是从i向左右两端扩展来优先获得最小花费。
  • 构造答案是最费劲的,当我们知道最小花费是mn后,可能存在多种构造方式满足最小花费,但如何取最小呢。
  • 依然枚举i∈{0-9},尝试把其它数字改成i,然后比较10个答案中的字典序最小的那个。
  • 对特定的i,修改其它数字j时,要遵循一个原则,先修改比它大的j,从左到右;后修改比它小的j,从右向左。
  • 因为:
    • 如果j<i,修改j显然会使字典序变大。
    • 如果j>i,修改j显然会使字典序变小。

3. 代码实现

import sys
from collections import *
from contextlib import redirect_stdout
from itertools import *
from math import sqrt
from array import *
from functools import lru_cache
import heapq
import bisect
import random
import io, os
from bisect import *

RI = lambda: map(int, sys.stdin.buffer.readline().split())
RS = lambda: map(bytes.decode, sys.stdin.buffer.readline().strip().split())
RILST = lambda: list(RI())
DEBUG = lambda x: sys.stderr.write(f'{str(x)}\n')

MOD = 10 ** 9 + 7


def my_bisect_left(a, x, lo=None, hi=None, key=None):
    """
    由于3.10才能用key参数,因此自己实现一个。
    :param a: 需要二分的数据
    :param x: 查找的值
    :param lo: 左边界
    :param hi: 右边界(闭区间)
    :param key: 数组a中的值会依次执行key方法,
    :return: 第一个大于等于x的下标位置
    """
    if not lo:
        lo = 0
    if not hi:
        hi = len(a) - 1
    else:
        hi = min(hi, len(a) - 1)
    size = hi - lo + 1

    if not key:
        key = lambda _x: _x
    while size:
        half = size >> 1
        mid = lo + half
        if key(a[mid]) < x:
            lo = mid + 1
            size = size - half - 1
        else:
            size = half
    return lo


def solve(n, k, s):
    s = list(map(int, s))
    cnt = Counter(s)
    mx = max(cnt.values())
    if mx >= k:
        return print(f"0\n{''.join(map(str, s))}")
    poses = [[] for _ in range(10)]
    for i, v in enumerate(s):
        poses[v].append(i)

    # 花x是否能搞出k个相同
    def calc(x):
        def f(i):
            cost = 0
            remain = k - cnt[i]
            for j in range(1, 10):
                if remain <= 0: break
                for p in i - j, i + j:
                    if 0 <= p <= 9:
                        c = min(cnt[p], remain)
                        cost += c * j
                        if cost > x: break
                        remain -= c
            return cost

        return any(f(i) <= x for i in range(10))

    mn = my_bisect_left(range(n * 10), True, key=calc)
    # DEBUG(mn)
    print(mn)

    def find(i):
        t = s[:]
        cost = 0
        remain = k - cnt[i]
        for j in range(1, 10):
            if remain <= 0:
                return ''.join(map(str, t))

            p = i + j
            if 0 <= p <= 9:
                ps = poses[p]
                c = min(cnt[p], remain)
                cost += c * j
                for x in range(c):
                    t[ps[x]] = i
                if cost > mn: break
                remain -= c
            p = i - j
            if 0 <= p <= 9:
                ps = poses[p][::-1]
                c = min(cnt[p], remain)
                cost += c * j
                for x in range(c):
                    t[ps[x]] = i
                if cost > mn: break
                remain -= c
        if remain <= 0:
            return ''.join(map(str, t))
        return 's'
    # for i in range(10):
    #     DEBUG((i,find(i)))
    print(min(find(i) for i in range(10)))


def main():
    n, k = RI()
    s, = RS()
    solve(n, k, s)


if __name__ == '__main__':
    # testcase 2个字段分别是input和output
    test_cases = (
        (
            """
6 5
898196
""",
            """
4
888188
"""
        ),
        (
            """
3 2
533
""",
            """
0
533
"""
        ),
        (
            """
10 6
0001112223
""",
            """
3
0000002223
"""
        ),
        (
            """
3 2
531
""",
            """
2
331
"""
        ),
    )
    if os.path.exists('test.test'):
        total_result = 'ok!'
        for i, (in_data, result) in enumerate(test_cases):
            result = result.strip()
            with io.StringIO(in_data.strip()) as buf_in:
                RI = lambda: map(int, buf_in.readline().split())
                RS = lambda: buf_in.readline().strip().split()
                with io.StringIO() as buf_out, redirect_stdout(buf_out):
                    main()
                    output = buf_out.getvalue().strip()
                if output == result:
                    print(f'case{i}, result={result}, output={output}, ---ok!')
                else:
                    print(f'case{i}, result={result}, output={output}, ---WA!---WA!---WA!')
                    total_result = '---WA!---WA!---WA!'
        print('\n', total_result)
    else:
        main()

六、参考链接

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

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

相关文章

POJ1007:DNA排序

一、Description One measure of unsortedness in a sequence is the number of pairs of entries that are out of order with respect to each other. For instance, in the letter sequence DAABEC’‘, this measure is 5, since D is greater than four letters to its ri…

傻白入门芯片设计,典型的2D/2D+/2.5D/3D封装技术(六)

集成电路终于成为了一级学科&#xff0c;对集成电路领域的投入也日益加大&#xff0c;集成电路属于电子集成技术的一种&#xff0c;那么&#xff0c;现在的电子集成技术发展到了什么程度呢&#xff1f; 先进的电子集成技术可以在不到芝麻粒大小的1平方毫米内集成1亿只以上的晶体…

Tableau 合集3:格式设置之可视化图显示百分比和提示工具对齐问题

一、前言 本文通过可视化图中显示不了百分比和提示工具无法对齐两个小问题出发&#xff0c;介绍了关于Tableau设置格式和工具提示的一些使用方法。 环境&#xff1a;Windows11 64位、Tableau desktop 2021.2 二、问题1&#xff1a;可视化图中显示不了百分比 问题描述&#…

springboot整合其它项目(连接池和监控)

目录 一、整合Druid 1. Druid是什么&#xff1f; 2.如何在Spring Boot中集成Druid连接池和监控&#xff1f; 二、整合Redis 1.集成redis之非注解式开发 2.集成redis之注解缓存开发 一、整合Druid 1. Druid是什么&#xff1f; Druid是Java语言中最好的数据库连接池。…

paddleocr识别模型训练记录

准备数据集 自己新建目录 下载识别预训练模型 下载之后是一个压缩包&#xff0c;解压后&#xff08;注意&#xff1a;rec是自己新建的目录&#xff09; 修改配置文件 修改内容&#xff1a; 1.训练后模型存储目录&#xff1b; 2.是否训练可视化&#xff1b; 3.训练数据集图…

tensorflow2 minist手写数字识别数据训练

✨ 博客主页&#xff1a;小小马车夫的主页 ✨ 所属专栏&#xff1a;Tensorflow 文章目录前言一、tenosrflow minist手写数字识别代码二、输出三、参考资料总结前言 刚开始学习tensorflow&#xff0c; 首先接触的是minist手写数字识别&#xff0c;用的梯度下降算法&#xff0c;…

linux下mysql的三种安装方法

目录1. 离线安装&#xff08;.tar.gz安装包&#xff09;2. 离线安装&#xff08;rpm安装包&#xff09;3. 在线安装&#xff08;yum安装&#xff09;前言安装环境 : Redhat Enterprise Linux 81. 离线安装&#xff08;.tar.gz安装包&#xff09; 参考这篇博客 2. 离线安装&am…

HTB-Toolbox

HTB-Toolbox信息收集提权信息收集 使用nmap简单扫描一下网站端口。 21 ftp22 ssh443 https&#xff1f; 去https看看。 网站基本是静态的。因为是https&#xff0c;所以有ssl协议&#xff0c;去看看吧。 more information里面能找到协议。 找到admin.megalogistic.com子域。…

Spring(完整版)

文章目录一、Spring(一)、Spring简介1、Spring概述2、Spring家族3、Spring Framework1、Spring Framework五大功能模块2、Spring Framework特性(二)、控制反转IOC1、IOC容器1、IOC思想2、IOC容器在Spring中的两种实现方式①BeanFactory②ApplicationContext③ApplicationContex…

配置elasticsearch用windows account(AD)登录

配置elasticsearch用windows account&#xff08;AD&#xff09;登录编辑es的配置文件创建role mapping文件添加windows account的密码给role mapping和cacert文件正确的权限重启kibana和elasticsearch在kibana页面登陆elasticsearch参考文章&#xff1a;• https://www.elasti…

vue中如何使用swiper以及解决swiper初始化过早的问题

后端的返回的数据用数组接收; 把swiper放到根组件里的mounted&#xff0c;也会出现swiper先初始化&#xff0c;dom再加载的问题&#xff1a; swiper初始化在mounted里执行&#xff1b;setTimeout定时器是从后端请求回来的数据&#xff1b; 代码执行顺序是&#xff1a;当组件创…

Eureka Server配置

01.Eureka Server配置 Eureka Server提供注册服务&#xff0c;各个节点启动后&#xff0c;会在EurekaServer中进行注册&#xff0c;Eureka Server会存储所有可用信息的服务节点&#xff0c;其信息可以在界面中直观的观察到。&#xff08;服务注册中心 CAP核心理论 一个分布式…

(十六)Spring对事务的支持

文章目录环境事务概述引入事务场景第一步&#xff1a;准备环境第二步&#xff1a;编写持久层第三步&#xff1a;编写业务层第四步&#xff1a;编写Spring配置文件第五步&#xff1a;编写表示层&#xff08;测试程序&#xff09;模拟异常Spring对事务的支持Spring事务管理API声明…

mysql-6-主从复制搭建

1 总结 1&#xff1a;主从复制最大缺陷就是延迟。 2 搭建前的准备 2.1复制的基本原则 每个slave只有一个master每个slave只能有一个唯一的服务器ID每个master可以有多个slavemysql版本尽量一致&#xff0c;防止出问题。两台服务能ping通MySQL主从是基于binlog的&#xff0c;主上…

Face Global | 创龙科技2款新品登陆TI全球官网

日前,创龙科技AM62x、AM64x处理器平台齐登TI全球官方网站,向全球TI用户提供高可靠性的工业核心板以及工业评估套件。 图 1 TI全球官网截图-AM64x 图 2 TI全球官网截图-AM62x 创龙科技(Tronlong)作为TI中国官方合作伙伴,自2013年成立以来,已基于TI Sitara、C6000、DaVinci、…

【网络安全必看】如何提升自身WEB渗透能力?

前言 web渗透这个东西学起来如果没有头绪和路线的话&#xff0c;是非常烧脑的。 理清web渗透学习思路&#xff0c;把自己的学习方案和需要学习的点全部整理&#xff0c;你会发现突然渗透思路就有点眉目了。 程序员之间流行一个词&#xff0c;叫35岁危机&#xff0c;&#xf…

OSPF路由策略引入

功能介绍&#xff1a; distribute-list 分发列表&#xff0c;通过distribute-list 工具对路由更新进行控制&#xff0c;只能进行路由条目过滤&#xff0c;不能修改路由的属性。 一、组网要求 在R2上把rip路由重分发进ospf&#xff0c;并且在重分发时进行路由过滤&#xff0c;…

【云原生】Docker-compose单机容器集群编排

内容预知 1.Compose的相关知识 1. Compose的相关概念 2. 为何需要docker-compose docker镜像管理的问题 Docker Compose的解决方案 3. Compose的特征 2. Docker-compose的安装 3. Compose配置常用字段和YAML 文件编写 3.1 YAML 文件格式及编写注意事项 &#xff08;1&…

[附源码]Python计算机毕业设计儿童闲置物品交易网站

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Java面试题-为什么重写equals就一定要重写hashCode方法呢?

目录 1、为什么要重写equals 方法 2、hashCode 方法 3、为什么要一起重写&#xff1f; 4 原因分析 总结 先放结论&#xff1a; hashCode 和 equals 两个方法是用来协同判断两个对象是否相等的&#xff0c;采用这种方式的原因是可以提高程序插入和查询的速度。如果只重写equ…