- MarsOJ 站内赛 Round1(青铜-ICPC赛制)
MarsOJ Round1 题解
- 2022-3-19 12:27:10 @
防止同学们直接复制粘贴,题解只给出python代码,请自行写出C++代码
方形字符串
-
如果字符串长度为奇数,直接输出NO
-
如果字符串长度为偶数
- 方法一(C++):通过
s.substr(0,s.size()/2)
获取前一半字符串,通过s.substr(s.size()/2,s.size()/2)
获取后一半字符串直接比较即可。 - 方法二(通用):枚举下标0到s.size()/2-1,比较
s[i]==s[i+s.size()/2]
是否都成立即可
- 方法一(C++):通过
case = int(input())
for T in range(case):
s = input()
n = int(len(s))
flag = 0
if n%2!=0 : flag = 1
for i in range (n//2):
if s[i] != s[i+n//2]:
flag = 1
if flag == 0 : print("Yes")
else : print("No")
净化字符串
枚举字符串中的每个字符s[i]
,如果s[i]==c
,判断左右两边的字符数量是否都是偶数,如果是则说明答案是YES,否则是NO
case = int(input())
for T in range(case):
s = input()
n = len(s)
c = input()
flag = 0
for i in range(n):
if s[i]==c[0] :
if i%2==0 and (n-i-1)%2==0 :
flag = 1
if flag == 1 : print("YES")
else : print("NO")
波利卡和子序列之和
题目说输出的数组的顺序随意,那我们就假设数组是从小到大排好序的,也就是
显然
紧接着会发现,不存在其他数比大但比小了(因为其他数要么是要么是某两个数的和,都比大),所以
显然
所以
cas = int(input())
for T in range(cas):
b = input().split(' ')
sum = 0
for i in range(7):
x = int(b[i])
if i==0 or i==1 :
print(x,end=" ")
sum = sum+x
elif i==6:
print(x-sum,end=" ")
print("")
平方和立方
以内的平方数有(向下取整)个,因为最大的平方数是(向下取整)的平方
以内的立方数有(向下取整)个,因为最大的立方数是(向下取整)的立方
但是有一部分数既是平方数又是立方数,也就是这种数,显然这样的数有个
所以根据小学的容斥原理得到:
但是直接用函数算这些东西会有误差,可以暴力算,以求为例:
int j = 1;
while((j+1)*(j+1)*(j+1)<=n)j++;
这样循环结束的时候,就是
cas = int(input())
for T in range(cas):
n = int(input())
x = int(pow(n,0.5))
y = 1
while (y+1)**3<=n : y = y+1
z = 1
while (z+1)**6<=n : z = z+1
print(x+y-z)
消失的音节
随便举个例子:
假设原串是abbaaba
,那么在擦除之前写在白板的是:ab bb ba aa ab ba
,前一个字符串的末尾等于后一个字符串的开头。
所以如果擦除掉的是中间的某个字符串,那么就会出现有某两个相邻字符串,前一个的末尾不等于后一个的开头,通过这种方法就能判断出来被擦除的是谁了。
如果没有这样的相邻字符串,可以认为擦除的是开头或者末尾的那个,随便添加一个字符到开头或者末尾就行了。
cas = int(input())
for T in range(cas):
n = int(input())
s = input().split(' ')
ans = s[0]
flag = 0
for i in range(1,n-2):
if s[i][0]==s[i-1][1]:
ans = ans+s[i][1]
else :
ans = ans+s[i]
flag = 1
if flag == 0 : ans = ans+"b"
print(ans)
DIV+MOD
这题和2021年的CSP-J/S入门组第一题非常像,但比那个题要难一点。
首先考虑式子的后半部分x mod a
:
- 如果,那么说明这部分一定能取到最大值
- 接下来的任务就是让这部分最大的同时,使得最大
- 根据取余运算的性质知道,在增大的过程中,余数在到之间循环变化,每过一个循环周期(也就是余数从变成时)增加,所以只要找到余数为的最大的即可。
- 先让,这样就是最小的余数为的数,这时就是还能增大的周期数,所以能使得余数为的最大的是
- 否则直接输出即可
cas = int(input())
for T in range(cas):
l,r,a = input().split()
l = int(l)
r = int(r)
a = int(a)
t = l%a
if t+(r-l)<a-1:
print(r//a+r%a)
else :
now = (a-1-t)+l
now += (r-now)//a*a
print(now//a+now%a)
7 条评论
-
魏千辰 LV 10 @ 2024-10-9 20:30:04
后排兜售小0食
-
2024-8-1 10:55:45@
太有实力了
-
2024-7-17 9:30:00@
qpkg
-
2024-7-8 10:55:39@
qp
-
2024-7-8 10:54:15@
qp
-
2024-7-5 22:32:57@
qp
-
2023-8-24 16:40:46@
qp
- 1