上帝的爱好

28 篇文章 0 订阅
7 篇文章 0 订阅
本文介绍了一种算法,用于解决从给定的句子中挑选出符合特定词牌要求的诗词组合问题。通过分析句子的韵脚,算法能够找出最多数量的符合XXYY、XYXY、XYYX、XXXX四种词牌的诗词,同时确保词的句子间不交错。
摘要由CSDN通过智能技术生成
题目描述

  我们知道,词都是按照词牌来填的,上帝为了考验小杉,只给了他四种词牌,但只要压韵就算符合词牌。
  小杉已经想好了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
程序分析
解题思路
  1. 找规律 (注意两个相同的数字称为一对,两队称为一组)
    XXYY  XYXY  XYYX  XXXX 四种情况包含了全部的2对数字情况。
    1)问题转化为:给你一个数字串,求每两对相同的数字是一组,求一共有多少组数字 (组与组之间元素不重叠)
    2)问题转化为:每找到两个成对的或者四个一样的算一句。找到后前面的都归零
  2. 深坑深坑深坑
    隐藏的测试样本中,N个数字之后有空格。需要对输入的字符串进行处理,去除右端的空格
  3. 组与组之间元素不重叠
    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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还能坚持

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值