倒数排序(10分)
将1到n的所有排列按照字典排成一排。从中选出一个排列,假设他是正数第Q个排列,输出倒数第Q个排列。
例如:
1到3的所有排列是:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
选出排列为 1 2 3,则Q=1, 输出倒数第Q个排列 为: 3 2 1
思路:其实仔细观察可以发现,这个排列是对称的,1 2 3 和 3 2 1 ,对应位置相加都是4,此时n = 3; 同理我们的测试案例 3 1 5 2 4 输出应该为3 5 1 4 2也是对应位置相加为6,此时n = 5; 这样应该可以看出规律。在笔试的时候,是我们把问题想得过于复杂了!!! 果然大神就是大神!!!!
1 #coding=utf-8 2 import sys 3 4 if __name__ == "__mian__": 5 #具体的读取数据,输出数据的格式,请参考例题 6 """ 7 python2 输入数据度数据的格式 8 n = int(sys.stdin.readline().strip()) #读取输入的数字 9 line = sys.stdin.readline().strip().split() #读取输入的数组 10 values = list(map(int,line)) 11 """ 12 13 """ 14 python3 输入数据度数据的格式 15 n = int(input("please input a number:")) 16 line = input("please input a list:").split(' ') 17 values = list(int(i) for i in line) #输入读取的是str类型,需要转换为int类型 18 """ 19 20 n = 5 21 values = [3,1,5,2,4] 22 23 result = list() #输出结果为一个list, 也可以 result = [] 24 for v in values: 25 result.append(n+1-v) 26 # 将 int类型数据 转换为 str 27 result = map(str,result) 28 print(' '.join(result))
数字圆环(20分)
数组 a1, a2, ..., an 长度为n
将这个n个数字构成一个环(首尾相连),使得环中每个数字都小于与她相邻的两个数字的和(每个数字都必须使用,且使用一次)
输入:
t 测试用例个数
n 数字个数
数组A=a1 a2 ... an
输出:
t行,对于每组样例,若能输出“YES”,否则输出“NO”
例如:
输入
1
5
17 6 17 11 17
输出
YES
操作次数不限, 求出在所有能通过若干次操作得到的数组中,输出 字典序最小的一个是什么?(字典序是啥)
输入
n 数组长度
a1,a2,..,an 数组,用空格分隔
保证 1<=n<=10^5; 1<=ai<=10^9
输出
数组 字典序最小的数组
思路:如果有奇偶,则直接排序;否则,直接输出
# A = [7,3,5,1]
A = [53941,38641,31526,75864,29026,12199,33522,58200,64784,31997]
result = list()
for v in A:
result.append(v)
temp1 = [x for x in result if x%2==0]
temp2 = [x for x in result if x%2!=0]
if temp1 != [] and temp2 != []:
result.sort()
result = [str(x) for x in result]
print(' '.join(result))
优秀的01序列(30分)
给定01序列S,序列S是优秀的01序列,定义如下:
1. 如果序列S,T是优秀的,则S+T也为优秀的, +定义为连接,即“010”+“110”=“010110”
2.若序列S,则按位取反后的序列rev(S)也是优秀的。 需要删除前导0,例如rev("1100101")="11010"
输入
T 数据组数
每组数组第一行为01序列S,第二行为01序列T
输出
对与每组数据,一行输出"YES",或者“NO”,表示序列T是不是优秀的
举例
1
1100
110011
输出
YES
示例2
输入
1
1000
100001111
输出
NO
解析:看不懂,
作者:NotDeep
链接:https://www.nowcoder.com/discuss/216237
来源:牛客网
我们对序列SSS不断执行rev操作,得到的一系列序列S1,S2S˙nS_{1},S_{2} \dot S_{n}S1,S2S˙n。再依次翻转每个序列的每一位,得到一系列序列T1,T2,T˙nT_{1},T_{2},\dot T_{n}T1,T2,T˙n
例如"110011"可以生成{"110011","1100","11"}与{"001100","0011","00"}
如果TTT是优秀的,当且仅当TTT是由这两组序列拼接而成,并且第一组序列中最原始的序列SSS不能接第二组序列中的序列。
可以使用dp来维护上述过程。令f[i][0/1]表示前i位是否优秀,且拼接的最后一个01串是不是初始序列SSS。按定义转移即可。