题目描述
我们知道,词都是按照词牌来填的,上帝为了考验小杉,只给了他四种词牌,但只要压韵就算符合词牌。
小杉已经想好了N个意境优美的句子,每个句子都有一个韵脚。
符合要求的词的句式应当有如下四种" XXYY" ," XYXY" ," XYYX" ," XXXX" ,其中X或Y表示韵脚。
现在小杉想知道,从他想的N个句子之中,最多能按顺序挑选出几首符合条件的词。
并且词的句子间不能交错,比如你选了1 4 6 8做为一首诗,那么7你就不能再选了。
输入数据
每组测试数据的
第一行有一个数 N (N≤ 4000) 。
第二行有N个不超104的 正整数,第i个整数表示第i个句子的韵脚,整数相同表示韵脚相同。
30%的数据 N≤ 100
输出数据
对每组测试数据输出一行,仅有一个数字,表示小杉最多能挑出几首词来。
样例输入
12
1 2 4 2 3 1 2 2 1 1 2 2
样例输出
2
样例说明
样例最多可以挑出两首词
- 一种方案:1 2 4 6 / 9 10 11 12
- 一种方案:1 2 4 6 / 7 8 9 10
程序分析
解题思路
- 找规律 (注意两个相同的数字称为一对,两队称为一组)
XXYY XYXY XYYX XXXX 四种情况包含了全部的2对数字情况。
1)问题转化为:给你一个数字串,求每两对相同的数字是一组,求一共有多少组数字 (组与组之间元素不重叠)
2)问题转化为:每找到两个成对的或者四个一样的算一句。找到后前面的都归零 - 深坑深坑深坑
隐藏的测试样本中,N个数字之后有空格。需要对输入的字符串进行处理,去除右端的空格 - 组与组之间元素不重叠
1)为了实现组与组之间元素不重叠,即词的句子间不能交错,需要设置一个起始位置start。每找到一组(两队)即一首词时,需要更新start的位置,不能再从之前的位置中需要句子,以此实现组与组之间元素不重叠。
2)注意,更新位置的时候,设置的是start = i(start = i+1也可以),因为每查找到一对相同的韵脚,就将其置为0,这样每次虽然是从上一次的最后一个位置开始,但是不会出现句子之间的交错这种情况。如果设置为start = i+1,那么在 for ii in range(start, i) 这个for循环中,每次都会跳出循环第一次的循环(因为start= (更新后的)i = (更新前的)i+1)。可见可以选择对相同的韵脚进行清0操作使用start = i;或者选择将start的位置置于遇到的第二次查找到韵脚相同的靠后的数字的位置的下一个位置,即用start = i+1
代码
N = int(input())
a = list(map(int, input().rstrip().split(" ")))
pairs, num, start = 0, 0, 0
for i in range(N):
for ii in range(start, i):
if a[ii] == a[i]:
pairs += 1
a[ii], a[i] = 0, 0 # 为了不影响后面的查找,标记为0,表示找到了一对相同韵脚的句子,
break
if pairs == 2: # 找到了两对相同韵脚的句子
pairs = 0 # 清0,查找新的
num += 1 # 成功得到一首词
start = i # 将起始的比较位置移动到第二次查找到韵脚相同的靠后的数字的位置
print(num)