小红的数组重排
考点:无
思路:
按题意模拟即可。
复杂度:O(1)
python
import sys
input=sys.stdin.readline
a1,a2,a3=map(int,input().split())
b1=a2
b2=a3
b3=a1
print(b1,b2,b3)
小红的回文串构造
考点:无
思路:
因为题目说了要所有字符互不相同,所以我们可以得出结论只有n是1的时候才有输出,其他都是No。
复杂度:O(n)
python
import sys
input=sys.stdin.readline
t=int(input())
for _ in range(t):
n=int(input())
if n==1:
print(chr((ord('a')+(n-1))))
else:
print("No")
小红的排列
考点:逆元
思路:
我们可以先算出偶数,奇数在n中的个数,然后在算出o,j,?在字符串a中的个数。
然后可以得到结论问号个数对上还要放的奇数个数的逆元乘上奇数总数的阶乘乘上偶数总数的阶乘就行了。
复杂度:O(n)
python
import sys
input=sys.stdin.readline
mod=998244353
n=int(input())
a=input().strip()
os=n//2
js=n-os
gso=a.count('o')
gjs=a.count('j')
qt=a.count('?')
if gso>os or gjs>js:
print(0)
sys.exit()
need=js-gjs
if need<0 or need>qt:
print(0)
sys.exit()
f=[1]*(n+1)
for i in range(1,n+1):
f[i]=f[i-1]*i%mod
def C(n,k):
if k<0 or k>n:
return 0
return f[n]*pow(f[k],mod-2,mod)%mod*pow(f[n-k],mod-2,mod)%mod
cnt=C(qt,need)*f[js]%mod*f[os]%mod
print(cnt%mod)
小红的中位数
考点:二分
思路:
找出比中位数小的和大的有多少个,然后将中位数公式变一下形,可以得出关于两边的两个式子。
复杂度:O(nlogn)
python
import sys
input=sys.stdin.readline
from bisect import bisect_left,bisect_right
n=int(input())
a=list(map(int,input().split()))
a.sort()
x=a[(n-1)//2]
l=bisect_left(a,x)
r=bisect_right(a,x)
g=n-r
ans=10**18
if l>0:
ans=min(ans,n-2*l)
if g>0:
ans=min(ans,n-(2*g-1))
if ans==10**18:
print(-1)
else:
print(ans)