Софтуерно Инженерство
Loading...
+ Нов въпрос
VasilK avatar VasilK 37 Точки

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 398 Точки

Здравей,

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

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

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

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

Здравей,

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

При вход:

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 398 Точки

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

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

Peace✌

0
VasilK avatar VasilK 37 Точки

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

1