Codeforces Round 761 Div2题解

前言:

已经很久没登陆Codoforces了,也好久没有写博客了,题解专栏里的这些题解是以前的存货,一直保存在电脑中。现在发出来,希望能对人有所帮助。我记得我的大部分代码都是python或c++写的,我认为python能更清楚地表达脑海中的想法,所以我更偏爱python,除非遇到一直超时的情况,不然我不会使用c++。

——2023年12月19日

A.Forbidden Subsequence

题意:给定字符串s和t,找出s的字典序最小的排列s',且t不是s'的子序列,其中t是abc的排列。

题解:可以使用计数排序找出s的字典序最小的排列s'。如果s中不包含abc中任一字母或t不是abc,直接输出s',因为此时对s'不论怎么删,都得不到t。如果t是abc,那么按acb的顺序输出前三个字符,再输出其他字符。

import sys
 
DEBUG = 0
 
if DEBUG==1:
    sys.stdin = open('A-1.in', 'r')
    #sys.stdout = open('tmp.out', 'w')
def readi():
    return [int(t) for t in input().split()]

def output(a,i):
    for j in range(a[i]):
        print(chr(i+ord('a')),end='')

def main():
    tc, = readi()
    for i in range(tc):
        s = list(input())
        t = input()
        a = [0]*26
        for i in range(len(s)): #计数排序
            a[ord(s[i])-ord('a')] += 1
        if s.count('a')==0 or s.count('b')==0 or s.count('c')==0 or t!='abc': #如果s中不包含abc中任一字母或t不是abc
            for i in range(26): #直接输出
                output(a,i)
        else: #如果t是abc,那么按acb的顺序输出
            output(a,0)
            output(a,2)
            output(a,1)
            for i in range(3,26):
                output(a,i)
        print()

main()

B.GCD Problem

题意:给定n,找出a,b,c使得a+b+c=n且gcd(a,b)=c。

题解:考虑c为1的情况。只需要a与b互质即可。枚举a,那么b=n-a-1。

import sys,math
 
DEBUG = 0
 
if DEBUG==1:
    sys.stdin = open('B-1.in', 'r')
    #sys.stdout = open('tmp.out', 'w')
def readi():
    return [int(t) for t in input().split()]

def output(a,i):
    for j in range(a[i]):
        print(chr(i+ord('a')),end='')

def main():
    tc, = readi()
    for i in range(tc):
        n, = readi()
        for a in range(2,n):
            b = n-a-1
            if math.gcd(a,b)==1:
                print(a,b,1)
                break
main()

C.Paprika and Permutation

题意:给定一个数列a,每次可以将一个元素变为除以的余数,可以任选。问能否得到一个1到n的排列。

题解:考虑具有值小于的性质,所以我们要让小的大于n的数字替换小的没在1到n中出现过的数字。找到1到n排列中没有在a中出现的数字,保存在b中。将数列a排序,对于数列a中的元素t,如果t小于n,那么t保持不变。如果t大于n,那么尝试让t变为b中的第一个数字。如果失败,说明没有答案。

import sys,math
 
DEBUG = 0
 
if DEBUG==1:
    sys.stdin = open('C-1.in', 'r')
    #sys.stdout = open('tmp.out', 'w')
def readi():
    return [int(t) for t in input().split()]

def output(a,i):
    for j in range(a[i]):
        print(chr(i+ord('a')),end='')

def solve(n,a):
    vis = [0]*(n+1)
    a.sort()
    b = [] #没出现在1~n中的的数字
    for i in range(n):
        if a[i]>=1 and a[i]<=n and vis[a[i]]==0:
            vis[a[i]] = 1
        else:
            b.append(a[i])
    b.sort()
    j=0
    for i in range(1,n+1):
        if vis[i]==0:
            if i<b[j]/2:
                j += 1
            else:
                print(-1)
                return
    print(len(b))

def main():
    tc, = readi()
    for i in range(tc):
        n, = readi()
        a = readi()
        solve(n,a)

main()

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值