Loading...
VasilK avatar VasilK 40 Точки

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));
    }
}
Тагове:
0
Programming Fundamentals 11/02/2019 18:31:17
emo.999 avatar emo.999 399 Точки

Здравей,

Струва ми се малко усложнен кода ти с тези проверки на едно място и доста променливи.

Споделям ти моето решение: тук

Можеш да вземеш идеи или да пренапишеш своето по подобен начин. Надявам се да е полезно.

0
11/02/2019 20:05:11
VasilK avatar VasilK 40 Точки

Здравей,

Кода ти е доста изчистен. Послужи ми като база за тестване и установих проблема.

При вход:

2
0!0!0!
Clone them!
my code your code
Best DNA sample 0 with sum: 0. Best DNA sample 1 with sum: 0.
null null 0 0 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) {

            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));
    }
}
0
11/02/2019 22:11:02
emo.999 avatar emo.999 399 Точки

Радвам се, че помогнах по някакъв начинsmiley

Съветвам те да се опиташ да го оптимизираш. Добра тренировка е. Поне аз се старая да го правя, веднъж след като взема 100-те точки.

Peace✌

0
VasilK avatar VasilK 40 Точки

Задължително го оптимизирам след като получа 100т. Това което ти постигаш с if проверки при мен се случва в list. Убеден съм че има начин да се оптимизира и без да променям основната логика. Много хитро че махаш нулите от самото начало. Тази подробност я бях проспал и първоначално кода отчиташе също най дълга поредица от нули.

1
emo.999 avatar emo.999 399 Точки

Реално можеш да си спестиш листа и това го виждам като най-адекватна точка за оптимизация.

Да, правил съм някакви магии. Вече не помня задачата и не мога да се ориентирам толкова добре.smiley

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.