题目1:镜像序列(找规律)
一个序列的生成方式如下:
序列生成需要一个基础序列A,这个序列由n个不大于100的数字组成,同时给定镜像复制次数n。
然后对于A进行m次镜像复制,例如序列A={1,2,3}
则一次镜像复制后得到的序列是{1,2,3,3,2,1)
两次镜像复制得到的序列是B=(1,2,3,3,2,1,1,2,3,3,2,1)。
现在给出你生成一个序列所需要的参数,请你计算该序列的第k位是多少。 输人描述 输入第一行包含三个整数n,m,k,含义如题所示。
(1<=n<=100,1<=m<=60,1<=k<=1e18,部分数据k<10000)
输入第二行包含n个正整数,每个正整数都不大于100,表示基础序列A。 数字间有空格隔开 输出仅包含一个正整数,即序列第k位的数字。
input:
3 3 10
1 2 3
# 输入
n, m, k = list(map(int, input().split()))
a = list(map(int, input().split()))
# 复杂度极高的解法:
# 用for循环生成
k = k - 1
for i in range(m):
i += 1
a = a + list(reversed(a)) #或者 a = a + a[::-1] 切片截取
print(a[k])
#用除余方法:
a = a + a[::-1]
k = k / (2*n) - 1
print(a[k])
题目2:加减数组元素使乘积为7(贪心或动态规划)
给定n个整数a1, a2, a3…an。每次操作可以选择其中一个数,并将这个数加上1或者减去1。
小红非常喜欢7这个数,他想知道至少需要多少次操作可以使这n个数的乘积为7?
输入描述
第一行输入一个正整数n,表示整数的个数。
第二行输入n个整数a1, a2, a3…an,其中ai表示第i个数。
输出描述
输出一个整数,表示将所有数的乘积变为7最少需要的操作次数。
input:
5
-6 0 2 -2 3
output:
6
# 贪心算法
# 一个元素 7
# 两个元素 7和1 ++ --
# 三个元素 7 1 1 +++ +--
# 贪心方法:先找最接近7或者-7的;再将其他值变为-1或1
# 输入
n = int(input())
A = list(map(int,input().split))
count = 0
neg = 0
if n > 1:
# map函数 map(function,iterable) iterable一个或者多个序列
# def f(x):
# return x*x
# print(list(map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])))
# str.split(str="", num=string.count(str)) num表示分隔次数,遇到num次分隔,后面的不管
# 寻找list里距离7或者-7最近的值,取绝对值法对原来的list进行取值
B = max(A, key = abs) #返回取绝对值后最大的值对应的原值
# max函数里用key关键词引用一个函数,先对该list调用函数再取max,并且返回的是原来list的值
# 字典里用key = a.get 表示a.get(item) 输出最大的值(item)对应的键(key)。否则在字典里的key中选最大值。
A.remove(B) #将该数值从列表中去除
if B>=0:
count += abs(B-7)
else:
count += abs(B+7)
# 负数要记录
neg += 1
# 对其他数取-1和1值,考虑如果有0,则可以不需要在意neg
M = min(A, key = abs)
# 将所有值调整为1或-1
for i in A:
# 把小于0的都调整为-1
if i < 0 :
count += abs(i + 1)
neg += 1
# 把大于等于0的都调整为1
else:
count += abs(i - 1)
# 如果有0,不需要考虑neg,只要变为1或-1都可以
if M != 0 && (neg / 2) != 0:
count += 2
else:
count = abs(7-B)
print