09.Kamino_Factory
Някой би ли погледнал кода.
90/100. Гърми на Тест 2.
има ли вероятност от инпут който да започва с ! -> !0!0!0!1!!1!0
import java.util.*;
public class Kamino_Factory {
public static void main(String[] args) {
Scanner scanner = new Scanner( System.in );
int l = Integer.parseInt( scanner.nextLine() );
int row = 0;
int bestrow = 0;
int max_seq = 1;
int min_ind = 0;
int max_sum = Integer.MIN_VALUE;
String [] arr_f = new String [l];
while (true) {
String input = scanner.nextLine();
if ("Clone them!".equals(input)) break;
String[] arr = input.split( "!+" );
List<String> list = new ArrayList<String>();
row++;
int n = 0;
for (int i = 0; i < arr.length - 1; i++) {
if (Integer.parseInt(arr[i]) == Integer.parseInt(arr[i + 1])) {
list.add( i + "_" + arr[i] + "_" + (n += 1));
} else n = 0;
}
int f_cnt = 0;
int f_ind = 0;
int f_val = 0;
int f_max = 0;
for (int x = 0; x < list.size(); x++) {
String[] v = list.get(x).split("_");
int key = Integer.parseInt(v[0]);
int value = Integer.parseInt(v[1]);
int count = Integer.parseInt(v[2]);
if ((key + 1 - key == 1) && f_cnt < count) {
f_ind = key;
f_val = value;
f_cnt = count;
}
}
/* MAX */
if (list.isEmpty()) f_val += Integer.parseInt(arr[0]);
for (int s = 0; s < arr.length; s++) {
if (Integer.parseInt(arr[s]) == f_val ) f_max += 1;
}
if ((f_cnt + 1) > 2 ) f_ind = (f_ind + 2) - (f_cnt + 1);
if ( max_seq < (f_cnt+1) || ( max_seq == (f_cnt+1) && min_ind > f_ind ) || ( max_seq == (f_cnt+1) && min_ind == f_ind && max_sum < f_max)) {
max_seq = (f_cnt+1);
min_ind = f_ind;
max_sum = f_max;
bestrow = row;
arr_f = Arrays.copyOf(arr, arr.length);
}
// System.out.println(String.join(" ", arr)+"_____"+(f_cnt+1)+"_"+f_ind+"_"+f_max+"_"+bestrow);
}
System.out.printf("Best DNA sample %d with sum: %d.%n", bestrow ,max_sum);
System.out.println(String.join(" ", arr_f));
}
}
Здравей,
Кода ти е доста изчистен. Послужи ми като база за тестване и установих проблема.
При вход:
Направих само една пормяна, в червено, по-долу и мина.
import java.util.*; public class Kamino_Factory { public static void main(String[] args) { Scanner scanner = new Scanner( System.in ); int l = Integer.parseInt( scanner.nextLine() ); int row = 0; int bestrow = 0; int max_seq = 1; int min_ind = 0; int max_sum = Integer.MIN_VALUE; String [] arr_f = new String [l]; while (true) { row++; String input = scanner.nextLine(); if ("Clone them!".equals(input)) break; String[] arr = input.split( "!+"); List<String> list = new ArrayList<String>(); int n = 0; for (int i = 0; i < arr.length - 1; i++) { if (Integer.parseInt(arr[i]) == Integer.parseInt(arr[i + 1])) { list.add( i + "_" + arr[i] + "_" + (n += 1)); } else n = 0; } int f_cnt = 0; int f_ind = 0; int f_val = 0; int f_max = 0; for (int x = 0; x < list.size(); x++) { String[] v = list.get(x).split("_"); int key = Integer.parseInt(v[0]); int value = Integer.parseInt(v[1]); int count = Integer.parseInt(v[2]); if ((key + 1 - key == 1) && f_cnt < count) { f_ind = key; f_val = value; f_cnt = count; } } /* MAX */ if (list.isEmpty()) { f_val += Integer.parseInt(arr[0]); } for (int s = 0; s < arr.length; s++) { if (Integer.parseInt(arr[s]) == f_val ) f_max += Integer.parseInt(arr[s]); } if ((f_cnt + 1) > 2 ) f_ind = (f_ind + 2) - (f_cnt + 1); if (max_seq < (f_cnt + 1) || (max_seq == (f_cnt + 1) && min_ind > f_ind) || (max_seq == (f_cnt + 1) && min_ind == f_ind && max_sum < f_max)) { max_seq = (f_cnt + 1); min_ind = f_ind; max_sum = f_max; arr_f = Arrays.copyOf(arr, arr.length); bestrow = row; } // System.out.println(String.join(" ", arr)+"_____"+(f_cnt+1)+"_"+f_ind+"_"+f_max+"_"+bestrow); } System.out.printf("Best DNA sample %d with sum: %d.%n", bestrow ,max_sum); System.out.println(String.join(" ", arr_f)); } }Радвам се, че помогнах по някакъв начин
Съветвам те да се опиташ да го оптимизираш. Добра тренировка е. Поне аз се старая да го правя, веднъж след като взема 100-те точки.
Peace✌
Задължително го оптимизирам след като получа 100т. Това което ти постигаш с if проверки при мен се случва в list. Убеден съм че има начин да се оптимизира и без да променям основната логика. Много хитро че махаш нулите от самото начало. Тази подробност я бях проспал и първоначално кода отчиташе също най дълга поредица от нули.
Реално можеш да си спестиш листа и това го виждам като най-адекватна точка за оптимизация.
Да, правил съм някакви магии. Вече не помня задачата и не мога да се ориентирам толкова добре.