首页 > 试题广场 >

彩色宝石项链

[编程题]彩色宝石项链
  • 热度指数:18801 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
有一条彩色宝石项链,是由很多种不同的宝石组成的,包括红宝石,蓝宝石,钻石,翡翠,珍珠等。有一天国王把项链赏赐给了一个学者,并跟他说,你可以带走这条项链,但是王后很喜欢红宝石,蓝宝石,紫水晶,翡翠和钻石这五种,我要你从项链中截取连续的一小段还给我,这一段中必须包含所有的这五种宝石,剩下的部分你可以带走。如果无法找到则一个也无法带走。请帮助学者找出如何切分项链才能够拿到最多的宝石。

输入描述:
我们用每种字符代表一种宝石,A表示红宝石,B表示蓝宝石,C代表紫水晶,D代表翡翠,E代表钻石,F代表玉石,G代表玻璃等等,我们用一个全部为大写字母的字符序列表示项链的宝石序列,注意项链是首尾相接的。每行代表一种情况。


输出描述:
输出学者能够拿到的最多的宝石数量。每行一个
示例1

输入

ABCYDYE
ATTMBQECPD

输出

1
3
array = list(input())
N = len(array)
i = 0
result = []
while i < N:
    if array[i] in ['A','B','C','D','E']:
        newArray = array[i:N] + array[0:i]
        need = ['A','B','C','D','E']
        toKing = 0
        begin = False
        for item in newArray:
            if not need:
                break
            if item in need and len(need) > 0:
                need.remove(item)
                begin = True
            if begin:
                toKing += 1
        result.append(toKing)
    i += 1
result = N - min(result)
print(result)

发表于 2018-11-27 17:54:59 回复(0)
s = input()
n = len(s)
s = s * 2
m = n

for i in range(n):
    a = s[i:i+n]
    x = []
    for j in "ABCDE":
        x.append(a.find(j))
    max_x = max(x)
    if m > max_x:
        m = max_x
print(n-(m+1))

发表于 2018-10-05 22:37:10 回复(0)
分享一个简单粗暴的思路和解答。
1.将每次输入的数组直接乘2拼接起来(NN=N+N),然后每次初始化的判断区间是输入数组的长度(N),之后每次左边收一格(left+=1),发现不能收了之后开始收右边(right-=1)
2.两边都不能收的时候返回此时剩余的宝石(len(N)-(r-l)),存入数组,循环输入字符串长度的次数
3.打印存入每次循环的值中的最大值即可

import sys
N=input()
NN=N+N
res=[]
for i in range(0,len(N)):
    l=i;r=i+len(N)-1
    left=0;right=0
    while((left==0)|(right==0)):
        while(('A'in NN[l:r])&('B'in NN[l:r])&('C'in NN[l:r])&('D'in NN[l:r])&('E'in NN[l:r])):
            l+=1
        left=1
        l-=1
        while(('A'in NN[l:r])&('B'in NN[l:r])&('C'in NN[l:r])&('D'in NN[l:r])&('E'in NN[l:r])):
            r-=1
        right=1
        r+=1
    res+=[len(N)-(r-l)]
print(max(res))


发表于 2018-08-22 02:41:09 回复(0)
1.两倍成环
2.下标截取,最短更新
xl = input('')*2
bs = {'A', 'B', 'C', 'D', 'E'}
if bs & set(xl) == bs:
    lenth = 10000
    for i in range(len(xl)//2):
        for j in range(5, len(xl)//2+1):
            if j >= lenth:
                break
            if bs & set(xl[i: i+j]) == bs:
                lenth = j
                break
    print(len(xl)//2-lenth)
else:
    print(0)

发表于 2018-07-26 15:16:57 回复(0)
#通过每位右移来找到最短子段
s=input()
l=len(s)
length=l#包含ABCDE的子段的长度为length,初始值为l
for i in range(l):#对s进行循环,使其首尾相连
    d=[]
    for j in 'ABCDE':#找出所有ABCDE的序号
        d.append(s.find(j))
    d.sort()#按顺序排列
    if length>d[-1]+1:#若当前子段长度大于最大序号,则更新长度
        length=d[-1]+1
    s=s[1:]+s[0]#最左的头部移到最右的尾部
print(l-length)#拿到的宝石数量为原始长度减去子段长度

发表于 2018-06-26 15:39:20 回复(0)

算是暴力求解了吧:
遍历数组,直到出现ABCDE中一个,再以改字符位开头,找到第一次出现的ABCDE的索引,再求最大的距离。直到数组遍历结束,找出真正最大距离。

def ca_min(index_list):
    index_list.sort()
    ans = max(index_list[1]-index_list[0],
              index_list[2] - index_list[1],
              index_list[3] - index_list[2],
              index_list[4] - index_list[3],
              len_x-index_list[4])
    return ans-1
X = input()
len_x= len(X)
temp = ['A','B','C','D','E']
flag = True
max_ans = 0
for i in temp:
    if i not in X:
        print(0)
        flag = False
        break
if flag:
    for i in range(len_x):
        if X[i] in temp:
            temp_x = X[i:]+X[:i]
            index = []
            for char_x in temp:
                index.append(temp_x.index(char_x))
            temp_ans = ca_min(index)
            if temp_ans>max_ans:
                max_ans = temp_ans
    print(max_ans)
编辑于 2018-05-25 00:22:36 回复(0)
def gemstone(gem):
    if len(gem)<5:
        return 0
    x=4
    gem=gem+gem[0:-1]
    gem_for_queen=['A','B','C','D','E']
    while 1:
        x+=1
        for i in range(len(gem)-x+1):
            if set(gem[i:i+x])&set(gem_for_queen)==set(gem_for_queen):
                return int((len(gem)+1)/2)-len(gem[i:i+x]),gem[i:i+x]
        if x ==len(gem):
            return 0
满足给皇后的项链必须瞒住的条件:(1)、大于5 (2)、连续 (3)、包含五种宝石  
所以:
1、小于5的直接不能获得宝石
2、大于5的项链,先每5颗宝石依次判断是否包含5种类型,然后是每6颗宝石进行判断,然后7、8、、、直到遇到一次判断包含五种宝石或者宝石链长度为整条项链长度为止
发表于 2018-03-21 11:20:58 回复(0)
while 1:
    try:
        left=0
        l=input()
        kk=len(l)
        l=l+l
        a=["A","B","C","D","E"]
        b=[-1,-1,-1,-1,-1]
        for i in range(len(l)):
            if l[i] in a:
                b[a.index(l[i])]=i
            if left<min(b):
                left=min(b)
            if min(b)>-1:
                kk=min(kk,max(b)-left+1)
        print(len(l)//2-kk)
    except:
        break
#遍历每个元素,假如是abcde中的一个,更新表b,记录下标,当表b中最小值不是-1时,这一段就满足了条件,更新最短长度。当出现重复元素时,b中会被更新,left就可以向右边走,其实就是走到下一个abcde中的一个,不用一个一个往右移。然后再次更新最短长度。。。大概是这意思。。
发表于 2018-03-07 16:17:55 回复(1)