Codeforces Round 863 (Div. 3) [A - E] 题解

Codeforces Round 863 (Div. 3) [A - E] 题解

A. Insert Digit

给定两个数字n和d,(1≤n≤2e5; 0≤d≤9) 把数字d插入到n的空隙中,使得插入后的数字最大。
贪心的从后往前遍历,如果当前的数字小于等于d,就可以插到这个位置

import sys
input = sys.stdin.readline

for _ in range(int(input())):
    n,d = map(int,input().split())
    s = input()
    idx = n
    for i in range(n - 1,-1,-1):
        if d > int(s[i]):
            idx = i
    print(s[:idx] + str(d) + s[idx:])

B - Conveyor Belts

在这里插入图片描述
有很多纸袋围成n * n 大小的圈,左下角点为1,1
给定x1,y1,x2,y2 求这两个点所在的纸带间的距离
模拟即可

import sys

input = sys.stdin.readline


for _ in range(int(input())):
    n, x1, y1, x2, y2 = list(map(int,input().split()))
    mx1 = max(abs(n + 1 - 2 * x1), abs(n + 1 - 2 * y1))
    mx2 = max(abs(n + 1 - 2 * x2), abs(n + 1 - 2 * y2))
    print(abs(mx2 - mx1) // 2)

C - Restore the Array

有一个长为n的数组a 和一个长为n-1的数组b,其中 b[i] = max(a[i],a[i + 1])
给出b数组,求一个a数组
我们可以发现对于ai,a(i + 1),a(i +2) 来说,
其会形成bi,b(i+1)
中间的a(i + 1)其实对于bi 和 b(i + 1)都有贡献,中间的数字必须要小于两边的最小值

import sys

input = sys.stdin.readline

def ii():
    return int(input())
    
def lii():
    return list(mi())


for _ in range(ii()):
    n = ii()
    b = lii()
    a = [0] * n
    a[0] = b[0]
    for i in range(1,n - 1):
        a[i] = min(b[i - 1],b[i])
    a[-1] = b[-1]
    print(*a)

D - Umka and a Long Flight

在这里插入图片描述

F函数是一个斐波那契数列,一个长方形的高h和宽w必须满足 h = F(n),w = F(n + 1)
一个长方形由n - 1个正方形组成,且每个正方形的边长都必须是斐波那契数列中的一个数字,每个正方形和其他正方形最多只有一条边相邻
给你一个边长为1的正方形的坐标, 求问是否可以将长方形分成n - 1个正方形

找规律,我们发现长方形一定是由这样的正方形构成的:
每个最大的正方形一定是紧挨着短的那条边的(或者说是高h),直接dfs强模拟,每次dfs重新计算1×1的正方形所在的位置即可
在这里插入图片描述

import sys

input = sys.stdin.readline


def I():
    return input()


def ii():
    return int(input())


def mi():
    return map(int, input().split())


def lii():
    return list(mi())


F = [1, 1]
for i in range(2, 46):
    F.append(F[i - 1] + F[i - 2])

for _ in range(ii()):
    n, x, y = mi()
    def dfs(n, x, y):
        if n <= 1: return True
        h, w = F[n], F[n + 1]
        if w - h < y <= h:
            return False
        if y > h:
            # x - h,y
            return dfs(n - 1, w - y + 1,x)
        return dfs(n - 1, w - h - y + 1,x)

    print("YES" if dfs(n, x, y) else "NO")

E - Living Sequence

请你找到不出现4的第k个数
比如a = [1,2,3,5,6,7,8,9,10,11,12,13,15,16,17,18 …]
那么k=4的时候为5

我们可以发现各位上不出现4,十位上不出现4,百位上不出现4…本质上就是一个9进制啊。
因此我们可以对9取余,如果余数大于等于四,说明此时已经包含了4,那么加一跳过4就好了

for _ in range(int(input())):
    n = int(input())
    base9 = ''
    while n:
        base9 += str(n % 9 + (n % 9 >= 4)); n //= 9
    print(base9[::-1])
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值