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. Убеден съм че има начин да се оптимизира и без да променям основната логика. Много хитро че махаш нулите от самото начало. Тази подробност я бях проспал и първоначално кода отчиташе също най дълга поредица от нули.
Реално можеш да си спестиш листа и това го виждам като най-адекватна точка за оптимизация.
Да, правил съм някакви магии. Вече не помня задачата и не мога да се ориентирам толкова добре.