小编Jim*_* Y.的帖子

子三角形中的最大元素总数

我尝试了今年CCC 2019 S5的最后一个问题

问题陈述:

在平行宇宙中,计算机科学中最重要的数据结构是三角形。大小为M的三角形由M行组成,第i行包含i个元素。此外,这些行必须布置成形成等边三角形的形状。也就是说,每一行都以穿过三角形中间的垂直对称线为中心。例如,下图显示了一个大小为4的三角形:

在此处输入图片说明

三角形包含子三角形。例如,上面的三角形包含10个大小为1的子三角形,六个大小为2的子三角形(其中两个是包含(3,1,2)的三角形和包含(4,6,1)的三角形),三个大小为3的子三角形(其中一个包含(2,2,1,1,4,2))。请注意,每个三角形都是其自身的子三角形。

您将获得一个大小为N的三角形,并且必须找到大小为K的每个子三角形的最大元素之和。

输入规格

第一行包含两个以空格分隔的整数N和K(1?K?N?3000)。

接下来是描述三角形的N条线。这些行的第i个包含i个以空格分隔的整数ai,j(0?ai,j?10 ^ 9),代表三角形的第i行。

对于15个可用标记中的4个,N?1000。

输出规格

输出大小为K的每个子三角形的最大元素的整数和。

样本输入

4 2
3
1 2
4 2 1
6 1 4 2
Run Code Online (Sandbox Code Playgroud)

样品输入输出

23
Run Code Online (Sandbox Code Playgroud)

不幸的是,我的解决方案给TLE判决,而且我不知道如何优化它。

这个问题基本上要求找到子三角形的最大元素并将它们加在一起。我的方法很简单,我迭代了大三角形的每个元素,使它们成为子三角形的“根”,然后尝试转到它的每个元素以找到max并将它们添加到结果中。

我需要改进我的解决方案的帮助,是否需要一些数据结构?

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    vector<vector<int>> triangle;

    int n;
    int k;

    cin >> n >> k;

    for (int i = 0; i < n; ++i)
    {
        triangle.push_back(vector<int>(i + 1, 0));

        for (int j = 0; j …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm optimization

6
推荐指数
1
解决办法
273
查看次数

C++编译需要永远

我在Windows下用gcc编译器编译了下面的简短C++代码

#include <iostream>

#define MAXN 1000000009

using namespace std;

bool prime[MAXN] = {true};

int main()
{
    for (int p = 2; p * p <= MAXN; ++p)
        if (prime[p])
        {
            cout << p << "\n";

            for (int i = p * p; i <= MAXN; i += p)
                prime[i] = false;
        }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面打印素数小于与埃拉托色尼的筛和1E9的代码没有任何错误,但我注意到,编译过程会花费更长的时间比其他的我的C++程序编译,花了大约几分钟,并没有错误完成消息.为了验证,我再次编译时获得了相同的结果.甚至更奇怪,在编译之后,代码没有打印任何东西并返回退出代码为0.我不明白发生了什么.是什么原因导致了这种奇怪

c++

-5
推荐指数
1
解决办法
146
查看次数

标签 统计

c++ ×2

algorithm ×1

optimization ×1