RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

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

Qbic's questions

Martin Hope
Qbic
Asked: 2022-11-29 19:28:58 +0000 UTC

梯形在零废物带上的放置

  • 6

有n个高度相同的梯形。浪费区域 - 当一个梯形连接到另一个梯形或连接到胶带的开头/结尾时,三角形的区域被切断。

任务是开发一种算法,用于在将梯形放置在胶带上时最大限度地减少浪费的面积。当您需要找到浪费区域为 0 的放置时,我会考虑使用简化版本。

梯形 (ABCD) 由三个数字给出:

  • Bx - B点的x坐标
  • Cx - C点的x坐标
  • Dx - D点的x坐标

A 点总是 (0, 0)

输入文件示例:

n
b1x c1x d1x
...
bnx cnx dnx

Example:
10
-100 0 500
-900 -100 500
-1400 -400 500
-500 -400 500
-900 -400 500
-1300 500 500
0 400 500
-800 -800 500
-900 -900 500
-600 -300 500

我写了一个递归算法,但它在处理大量梯形时运行缓慢。1000个梯形,他数了很久。

程序.cs

using Minimization;

const int h = 10;

decimal StartArea(int bx) => Math.Abs(bx) * h / 2;

decimal EndArea(int cx, int dx) => Math.Abs(cx - dx) * h / 2;

decimal Area(int cx, int dx, int bx) => (cx < dx && bx < 0) || (cx > dx && bx > 0) ?
        (Math.Abs(cx - dx) - Math.Abs(bx)) * h / 2 :
        (Math.Abs(cx - dx) + Math.Abs(bx)) * h / 2;

var path = @"c:\tests\9.txt";

var trapezoids = FileUtilities.GetTrapezoids(path);

HashSet<(int bx, int cx, int dx, int index)> startCandidates = new();

for (var i = 0; i < trapezoids.Length; i++)
{
    if (StartArea(trapezoids[i].bx) == 0)
        startCandidates.Add((trapezoids[i].bx, trapezoids[i].cx, trapezoids[i].dx, i));
}

var candidates = new Dictionary<int, HashSet<int>>();

for (var i = 0; i < trapezoids.Length; i++)
{
    candidates[i] = new HashSet<int>();
    for (var j = 0; j < trapezoids.Length; j++)
    {
        if (i == j) continue;
        if (Area(trapezoids[i].cx, trapezoids[i].dx, trapezoids[j].bx) == 0)
            candidates[i].Add(j);
    }
}


int[] res = null;

foreach (var (bx, cx, dx, index) in startCandidates)
{
    res = new int[trapezoids.Length];
    var currentPlace = 0;

    var currentIndex = index;
    res[currentPlace] = currentIndex;
    currentPlace++;

    res = PossibleList(currentPlace, res.AsSpan(), trapezoids);

    if (res != null)
        break;
}

int[]? PossibleList(int currentPlace, Span<int> span, Span<(int bx, int cx, int dx)> trapezoids)
{
    var currentIndex = res[currentPlace - 1];

    var nextCandidates = Except(candidates[currentIndex], span, currentPlace);

    if (nextCandidates.Count == 0)
        if (currentPlace == trapezoids.Length && EndArea(trapezoids[currentIndex].cx, trapezoids[currentIndex].dx) == 0)
            return span.ToArray();
        else
            return null;

    foreach (var candidate in nextCandidates)
    {
        span[currentPlace] = candidate;

        var possible = PossibleList(currentPlace + 1, span, trapezoids);

        if (possible != null)
            return possible;
    }

    return null;
}

HashSet<int> Except(HashSet<int> candidates, Span<int> span, int currentPlace)
{
    var res = new HashSet<int>();

    foreach (var candidate in candidates)
        if (!span[..currentPlace].Contains(candidate))
            res.Add(candidate);

    return res;
}

文件实用程序.cs

namespace Minimization
{
    /// <summary>
    /// Утилиты для работы с файлами
    /// </summary>
    public static class FileUtilities
    {
        public static Span<(int bx, int cx, int dx)> GetTrapezoids(string path)
        {
            using var sr = new StreamReader(path);

            var n = int.Parse(sr.ReadLine()!);

            var res = new (int bx, int cx, int dx)[n];

            for (var i = 0; i < n; i++)
            {
                var str = sr.ReadLine();
                var splitted = str!.Split();
                res[i] = (int.Parse(splitted[0]), int.Parse(splitted[1]), int.Parse(splitted[2]));
            }

            return res.AsSpan();
        }
    }
}

如何优化算法?我正在考虑尝试使用堆栈,但我真的不知道没有递归该怎么做。

c#
  • 1 个回答
  • 43 Views
Martin Hope
Qbic
Asked: 2021-12-07 22:33:53 +0000 UTC

将字符串分解为单独的功能部分

  • 0

任务:通过分隔符“;”将字符串分成几部分 该函数的形式为 Sum(expr) 或 Sum(expr; condition)。嵌套理论上是无限的

输入:Sum(a;b) 输出 expr = a 条件 = b

输入:Sum(a) 输出 expr = a 条件 = null

输入数据:Sum(Sum(a;c);b) 输出数据 expr = Sum(a;c) 条件 = b

输入数据:Sum(Sum(a);Sum(b;d)) 输出数据 expr = Sum(a) 条件 = Sum(b;d)

请告知如何最好地处理这些情况。我尝试使用搜索 IndexOf(";"),它在嵌套的情况下无法正常工作

c#
  • 2 个回答
  • 10 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