我知道这个问题已经被问到但我无法理解我的代码中的问题。我知道我们必须以降低成本的方式使用成本以获得最低成本,而且我做了同样但仍然提供了错误的输出。
由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
答案 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 运算符:
||