前言:
已经很久没登陆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()
本文分享了三道编程题目,涉及字符串处理(查找子序列并调整字典序)、数论(求解GCD问题)和数组操作(将数列转换为特定排列)。作者强调了Python的清晰性,但在时间复杂度要求高的情况下会使用C++。
1171

被折叠的 条评论
为什么被折叠?



