切割木板的成本

时间:2016-01-06 15:03:53

标签: c++ algorithm c++11

我知道这个问题已经被问到但我无法理解我的代码中的问题。我知道我们必须以降低成本的方式使用成本以获得最低成本,而且我做了同样但仍然提供了错误的输出。

由m×n木制方块组成的板子,要求他找到将板子折断成单个1×1件的最低成本。为了打破董事会,鲍勃必须沿着水平和垂直线切割。

要将板减少到正方形,必须在位置x1,x2,...,xn-2,xn-1和ym-1处进行xn-1垂直切割,必须在位置y1,y2,...处进行水平切割, YM-2,YM-1。沿着一些xi(或yj)的每个切割都有成本cxi(或cyj)。如果成本削减c通过n个已切割的段,则削减的总成本为n×c。

将整块板切割成1×1方块的成本是每次连续切割成本的总和。回想一下,削减成本乘以它所穿过的已切割段的数量,因此每次削减都会越来越昂贵。

输入格式

第一行包含一个整数T,表示测试用例的数量。随后的3T行描述了3行中的每个测试用例。

对于每个测试用例,第一行有两个正空格分隔的整数m和n,详细说明了电路板各自的高度(y)和宽度(x)。 第二行具有m-1个以空格分隔的整数,列出了从y1,y2,...,ym-2,ym-1在每个相应位置切割板的一部分的成本cyj。 第三行有n-1个以空格分隔的整数,列出了从x1,x2,...,xn-2,xn-1切割每个相应位置的电路​​板一部分的成本cxi。

注意:如果我们要将m×n板叠加在2D图形上,x0,xn,y0和yn都将是板的边缘,因此不是有效的切割线。

约束 1≤T≤20 2≤m,n≤1000000 ,0≤cxi,cyj≤1000000000

输出格式

对于每个T测试用例,找到将板切割成1×1方块的最低成本(MinimumCost)并打印MinimumCost%(1000000000 + 7)的值。

#include <iostream>
#include <limits>
using namespace std;

int main() {
    int t,ch=0;
    long int pos,m,n,h=1,l=1;
    long long int cost=0,*x,*y,temp;
    cin>>t;
    while(t>0)
    {cin>>m>>n;
     cost=0;
    x = new long long int[n-1];
    y = new long long int[m-1];
    for (long i=0;i<m-1;i++)
        cin>>y[i];
    for(long i=0;i<n-1;i++)
        cin>>x[i];
    h=1;
    l=1;
    while((h!=m)|(l!=n))
    {ch=0;
    temp=0;
    for (long i=0;i<m-1;i++)
        if (temp<y[i])
            {temp=y[i];
            pos=i;
            }
    for(long i=0;i<n-1;i++)
        if (temp<x[i])
        {temp=x[i];
        pos=i;
        ch=1;
        }
    cost=cost+temp*(ch==0?l:h);
    if (ch==0)
            {y[pos]=-1;
            h++;}
        else
            {x[pos]=-1;
            l++;
            }

    }
    cout<<cost%1000000007;
    t--;

    }
    return 0;
}

提供错误输出的测试用例:

输入:

5

52 30

2 30 79 47 4 56 47 67 25 30 75 58 47 54 66 61 6 64 28 41 75 36 1 92 42 61 35 56 12 86 84 14 68 63 13 72 19 60 39 96 43 14 55 42 21 73 3 27 37 84 68

64 72 21 56 14 35 44 71 47 82 7 14 50 71 79 23 42 92 14 39 35 81 46 29 2 19 84 81 57

23 43

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23

60 76

7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7

30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30

58 40

71 58 61 51 33 3 43 48 94 30 29 40 59 83 12 43 64 69 64 65 42 57 40 72 64 98 98 47 56 6 85 79 65 46 30 98 49 25 98 96 7 27 88 66 10 0 62 26 69 78 92 64 87 84 88 51 35

87 50 91 45 35 22 62 81 53 61 83 30 59 31 38 39 19 56 1 20 70 28 41 48 72 57 35 56 46 39 91 85 41 34 30 77 57 93 10

47 94

6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 < / p>

17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17

输出

51028

1912

33638

91124

27525

1 个答案:

答案 0 :(得分:0)

这一行可能是一个促成因素:

String str = " <play> a < b  <play> at < button >\n <play> a < 90 <play> at < button >\nhgsf a< sjdfvh> dasjfh a>jsdhf a<fan> a< button and > sjf";
StringBuffer result = new StringBuffer();
Matcher m = Pattern.compile("(\\s*<\\s*\\w+\\s*>\\s*)|\\s*([<>])\\s*").matcher(str);
while (m.find()) {
    String replacement = m.group(1) != null ? // Check if Group 1 is matched
        m.group(1) : //If yes, use Group 1
        (m.group(2).equals("<") ? " less than " : " greater than "); // If not, replace Group 2
    m.appendReplacement(result, replacement); //  Add the replacement
}
m.appendTail(result);
System.out.println(result.toString());

while((h!=m)|(l!=n)) 运算符是二进制算术运算符。

也许您正在寻找|,这是逻辑OR 运算符:

||