RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-602691

user602691's questions

Martin Hope
user602691
Asked: 2024-07-02 04:53:42 +0000 UTC

找到最大长度的子序列,其总和为负且奇数

  • 9

健康)状况:

令S为从1开始连续编号的N个整数的序列。令S(L,R)表示由S中包含的连续元素组成的子序列,从编号为L的元素开始到编号为R的元素结束。我们需要找到这样的元素L和R的数量值,其中0 < L< R ≤ N,使得子序列S(L, R)的元素之和为奇数且负数。

在您的答案中,指出该子序列的长度(即该子序列中包含的元素数量)。如果有多个这样的子序列,请指出它们的最大长度。

输入数据
给出两个输入文件(文件 A(约 1000 个数字)和文件 B(约 300,000 个数字)),每个文件的第一行都包含数字 N (3 < N < 10,000,000) - 整数的数量。接下来的M行每一行包含一个绝对值不超过1000的整数。

在您的答案中,指明两个数字:首先是文件 A 的所需值,然后是文件 B 的所需值。

在输入文件中组织数据的典型示例

8
-73
153
35
0
-44
78
-69
2

使用这样的输入数据,问题条件通过 0 + (-44) + 78 + (-69) 和 0 + (-44) + 78 + (-69) + 2 之和满足。问题的答案是5号。

该问题有 2 个文件:for 和 for 300,000 个数字。

我的决定:

对于第一个文件,O(N^2)搜索算法是合适的。它不适合第二个,所以我尝试创建另一个。

这个想法是创建一个包含从第一个元素到第 i 个元素的所有元素之和的数组,以及 2 个包含偶数和奇数值的先前和的数组,其中每个元素都大于前一个元素。然后检查第一个数组的元素与具有不同奇偶校验的另一个数组的元素之间的差异。如果此差值小于 0,则继续进行下一个金额。

问题是,在 30,000 个元素之后,速度大大减慢,并且第二个文件的执行需要几个小时。谁能提出更好的解决方案?

我的代码

f = open('file.txt')
n = int(f.readline())
a = [int(f.readline())]
sums = [a[0]]
for i in f:
    i = int(i)
    a.append(i)
    sums.append(sums[-1]+i)
mxs0 = [[], []]
mxs1 = [[], []]
k0 = []
k1 = []

for i in range(2,n):
    if sums[i-2] % 2 == 0:
        if len(k0) == 0:
            k0.append(i-2)
        elif k0[-1] < sums[i-2]:
            k0.append(i-2)
    if sums[i-2] % 2 == 1:
        if len(k1) == 0:
            k1.append(i-2)
        elif k1[-1] < sums[i-2]:
            k1.append(i-2)
    mxs0.append(k0)
    mxs1.append(k1)

lens = []
for i in range(2,n):
    print(i)
    if sums[i]%2==0:
        if len(mxs1[i]) > 0 > sums[i]-sums[mxs1[i][-1]]:
            for j in range(len(mxs1[i])):
                if sums[i]-sums[mxs1[i][j]] < 0:
                    lens.append(a[mxs1[i][j] + 1:i + 1])
                    break
    else:
        if sums[i] < 0:
            lens.append(a[0:i+1])
        else:
            if len(mxs0[i]) > 0 > sums[i]-sums[mxs0[i][-1]]:
                for j in range(len(mxs0[i])):
                    if sums[i]-sums[mxs0[i][j]] < 0:
                        lens.append(a[mxs0[i][j] + 1:i + 1])
                        break
cc = 0
lens = [i for i in lens if type(i) != int]
for i in range(len(lens)):
    cc = max(cc, len(lens[i]))
print(cc)
python
  • 1 个回答
  • 104 Views

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5