我正在审问ICPC问题HERE
问题归结为找到最大值。这可以通过具有*和的矩阵中的K运算来实现。这样我们就可以在一次操作中连续切换元素。我首先切换导致正数或零的行(切换行2次给0改变)按降序顺序改变*。最后,如果剩下1个切换,则在具有负变化的行中切换具有最小绝对值的行。
这是我的代码 - BELOW CODE IN IDEONE.COM WITH SOME TEST CASES
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
for (t = t; t > 0; t--) {
int n = sc.nextInt();
int m = sc.nextInt();
int k = sc.nextInt();
char[][] array = new char[n][m] ;
int[] tracker = new int[n];
int[] trackerl = new int[n];
int i,j;
for (i = 0; i < n; i++) {
String temp = sc.next();
for (j = 0; j < m; j++) {
array[i][j] = (temp.charAt(j));
}
}
int light = 0, diamond = 0;
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
if (array[i][j] == '*') {
diamond++;
}
}
tracker[i] = diamond;
diamond = 0;
}
int a, b;
int temp;
int sortTheNumbers = n;
for (a = 1; a < sortTheNumbers; a++) {
for (b = 0; b < sortTheNumbers-a; b++) {
if (tracker[b] > tracker[b + 1]) {
temp = tracker[b];
tracker[b] = tracker[b + 1];
tracker[b + 1] = temp;
}
}
}
for (i = 0; i < n; i++)
trackerl[i]=m-tracker[i];
int br = 0;
try {
if (m % 2 == 0) {
for ( i = 0; i <= n - 1; i++)
if (tracker[i] > (m) / 2)
br++;
}
if (m % 2 !=0 ) {
for (i = 0; i <= n - 1; i++)
if (tracker[i] >= (m + 1) / 2)
br++;
}
} catch (Exception e) {
}
int ans = 0;
try {
if (br >= k) {
for (i = n - 1; i > (n - 1 - k); i--)
ans += tracker[i];
for (i = (n - 1 - k); i >= 0; i--)
ans += trackerl[i];
}
if (br < k) {
if (br != 0 && br != n) {
for (i = n - 1; i > (n - br); i--) {
ans += tracker[i];
k--;
}
int pass1 = 0, pass2 = 0;
if (k % 2 == 0)
pass1 = Math.max(tracker[(n - br)] + tracker[(n - br - 1)],
trackerl[(n - br)] + trackerl[(n - br - 1)]);
if (k % 2 != 0)
pass2 = Math.max(tracker[(n - br)] + trackerl[(n - br - 1)],
trackerl[(n - br)] + tracker[(n - br - 1)]);
// System.out.print("Hp" + tracker[(n - br)]);
}
ans += Math.max(pass1, pass2);
for (i = (n - 2 - br); i >= 0; i--)
ans += trackerl[i];
}
if (br != 0 && br == n) {
for (i = n - 1; i > (n - br); i--) {
ans += tracker[i];
k--;
}
if (k % 2 != 0) {
ans += tracker[(n - br)];
}
if (k % 2 == 0) {
ans += trackerl[(n - br)];
}
for (i = (n - 1 - br); i >= 0; i--) {
ans += trackerl[i];
}
}
if (br == 0) {
if (k % 2 != 0) {
ans += tracker[(n - 1)];
}
if (k % 2 == 0) {
ans += trackerl[(n - 1)];
}
for (i = (n - 2); i >= 0; i--) {
ans += trackerl[i];
}
}
}
} catch (Exception e) {
}
System.out.println(""+ans);
}
}
}
无论我选择哪个测试用例都会给出正确的答案。我在测试用例中保持了多样性,正如你可以从链接中看到的那样。代码不正确,因为法官不接受。我真的找不到缺陷在哪里。它是我的代码还是我的逻辑?请指出我。
答案 0 :(得分:2)
编写代码与编写论文相同,有语法,拼写,标点符号和其他规则,使代码可读,重点明确。研究这些和编写清晰的代码可以获得回报,不仅适用于需要阅读代码的其他人,也适用于您(您将看到更多自己的错误)。
我只想指出格式化代码时遇到的一些项目。 (例子来自内存,而不是你的代码)
if(x=3;y>(2-2-x);y++)
不要写这样的行,因为
如果不是一个函数,并选择“if(”over“if(”使它看起来更像一个函数。同样关键字同时强>
将多个算术运算字符串(尤其是'+'和' - ')放在一个长行中(如“(2-2-x)”)会混淆' - '字符可以播放的双重角色你最好放入空格“(2 - 2 - x)”,让读者意识到我们正在处理多次减法,没有一元否定操作(负数)。
如果语句需要三个参数(以分号分隔)。在每个参数之后放入空格可以向读者发出信号,表明它们处于“下一个”参数中。支持“if(x = 3; y&gt;(2-2-x); y ++)”over“if(x = 3; y&gt;(2-2-x); y ++)”。
在接下来的例子中
if(x=3;y>(2-2-x);y++)
{x=3;y=2;}
以下行中的括号会产生阅读理解问题。
它们会遇到与if语句后没有括号相同的格式问题。通过将整个块放在一条线上,您会混淆块和线,并且任何线重新排序都会显着影响程序的运行。这是不好的。要解决此问题,请支持“if(x = 3; y&gt;(2 - 2 - x); y ++){”。
在一行上有一个复合语句,它模仿上面if语句的格式,这可能会让读者误以为这是后续嵌套if语句的一部分。将两个赋值语句放在各自的行上更具可读性。
将块的结尾绑定到语句,该语句将块边界耦合到特定操作。通常需要更新他们的代码,并且在程序的生命周期内应该连接块的语句和结尾的可能性很小。倾向于将块分隔符的结尾放在非语句行上。
以上所有要点在一起使用时会产生类似于
的代码if (x = 3; y > (2 - 2 - x); y++) {
x = 2;
y = 3;
}
经过一些简单的格式化后,很明显你有多个块“如果这个,那么”。很明显,很多这些块都遵循一种模式,“如果这样,那么。如果不是这样,那么”。该语言具有处理此类模式的内置功能,并在前面的if块中附加了“else”块。
(直接来自您的代码)
if (k % 2 != 0) {
ans += tracker[(n - 1)]
}
if (k % 2 == 0) {
ans += trackerl[(n - 1)];
}
可以更清晰地写出来
if (k % 2 != 0) {
ans += tracker[(n - 1)]
} else {
ans += trackerl[(n - 1)];
}
或者,使用重新排序来强调不平等的平等
if (k % 2 == 0) {
ans += tracker1[(n - 1)]
} else {
ans += tracker[(n - 1)];
}
可以继续,但是在你做了这些更改之后,你的代码真的开始在一个更好的地方,所以谈论更高级别的技术使你的代码可读,直到一些基础知识是没有意义的完成。即便如此,我还是建议您为变量名使用完整的单词,以试图描述变量的用途。
祝你好运,在我的重新格式化中,我可能已经剪切了一个关闭块分隔符(它们不匹配)或者可能它首先不存在(不像可以检查未格式化的版本)。