数列 {An} 为N的一种排列。
例如N=3,可能的排列共6种:
1, 2, 3 1, 3, 2 2, 1, 3 2, 3, 1 3, 1, 2 3, 2, 1
定义函数F:
其中|X|表示X的绝对值。
现在多多鸡想知道,在所有可能的数列 {An} 中,F(N)的最小值和最大值分别是多少。
1, 2, 3 1, 3, 2 2, 1, 3 2, 3, 1 3, 1, 2 3, 2, 1
第一行输入1个整数T,表示测试用例的组数。
( 1 <= T <= 10 )
第二行开始,共T行,每行包含1个整数N,表示数列 {An} 的元素个数。
( 1 <= N <= 100,000 )
共T行,每行2个整数,分别表示F(N)最小值和最大值
2 2 3
1 1 0 2
对于N=3:
- 当{An}为3,2,1时可以得到F(N)的最小值0
- 当{An}为2,1,3时可以得到F(N)的最大值2
对于60%的数据有: 1 <= N <= 100
对于100%的数据有:1 <= N <= 100,000
t = int(input()) def getmin(n): if n % 4 == 1 or n % 4 == 2: return 1 if n % 4 == 3 or n % 4 == 0: return 0 for i in range(t): n = int(input()) print(getmin(n), n - getmin(n - 1))
对最小值的求解,当数组是上升或者下降的时候均满足,其值只能是1或者0,通过函数calc_min()
直接计算。
最大值的求解,不能通过回溯去生成序列(时间复杂度太高),由函数F
的公式:,要使得F(x)
最大,即令F(x-1)
最小,即N - calc_min(N-1)
。
def calc_min(N): min_li = [i for i in range(N,0,-1)] res = min_li[0] for i in range(1,N): res = abs(res-min_li[i]) return res def calc_min_max(N): min_val = calc_min(N) max_val = N - calc_min(N-1) print("{} {}".format(min_val,max_val)) def main(): T = int(input()) for i in range(T): N = int(input()) if N == 1: print("1 1") else: calc_min_max(N) main()