CSES - Datatähti 2017 alku - Results
Submission details
Task:Maalarit
Sender:JesseNiininen
Submission time:2016-10-13 18:08:29 +0300
Language:Java
Status:READY
Result:37
Feedback
groupverdictscore
#1ACCEPTED12
#2ACCEPTED25
#30
#40
Test results
testverdicttimegroup
#1ACCEPTED0.12 s1details
#2ACCEPTED0.14 s1details
#3ACCEPTED0.14 s1details
#4ACCEPTED0.14 s1details
#5ACCEPTED0.13 s1details
#6ACCEPTED0.13 s1details
#7ACCEPTED0.15 s2details
#8ACCEPTED0.17 s2details
#9ACCEPTED0.20 s2details
#10ACCEPTED0.21 s2details
#11ACCEPTED0.17 s2details
#12ACCEPTED0.13 s2details
#13ACCEPTED0.17 s3details
#14ACCEPTED0.18 s3details
#15ACCEPTED0.17 s3details
#16ACCEPTED0.16 s3details
#17--3details
#18ACCEPTED0.13 s3details
#19--4details
#20--4details
#21--4details
#22--4details
#23--4details
#24--4details

Code

import java.util.*;

public class Maalarit3 {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        int n = Integer.parseInt(scanner.nextLine());
        String[] input = scanner.nextLine().split(" ");
        int[] heights = new int[n];
        for (int i = 0; i < n; i++) {
            heights[i] = Integer.parseInt(input[i]);
        }

        int maxHeight = 0;
        int maxHeightIndex = 0;
        for (int i = 0; i < heights.length; i++) {
            if (heights[i] > maxHeight) {
                maxHeight = heights[i];
                maxHeightIndex = i;
            }
        }

        boolean reversed = false;
        if (maxHeightIndex / ((float) heights.length - 1) > 0.5f) {
            for (int i = 0; i < heights.length / 2; i++) {
                int temp = heights[i];
                heights[i] = heights[heights.length - 1 - i];
                heights[heights.length - 1 - i] = temp;
            }
            reversed = true;
        }

        final int maxWorkers = 3;
        boolean done = false;
        int[] order = new int[n];
        long minCost = Long.MAX_VALUE;
        int[] bestOrder = new int[n];

        int currentIndex = 0;

        while (!done) {
            long score = check(heights, order, currentIndex, maxWorkers, minCost, maxHeight);
            boolean bestSoFar = score < minCost;

            if (bestSoFar && currentIndex == order.length - 1) {
                minCost = score;
                System.arraycopy(order, 0, bestOrder, 0, order.length);
            }

            if (bestSoFar && currentIndex != order.length - 1) {
                currentIndex++;
            } else {
                order[currentIndex]++;
                while (order[currentIndex] >= maxWorkers) {
                    if (currentIndex == 0) {
                        done = true;
                        break;
                    }
                    order[currentIndex--] = 0;
                    order[currentIndex]++;
                }
            }

        }

        int workers = 1;
        for (int i = 0; i < bestOrder.length; i++) {
            if (bestOrder[i] > workers) {
                workers = bestOrder[i];
            }
        }
        workers++;

        System.out.println(minCost + " " + workers);
        StringBuilder str = new StringBuilder();
        for (int i = 0; i < bestOrder.length; i++) {
            if (!reversed) {
                str.append(bestOrder[i] + 1).append(" ");
            } else {
                str.append(bestOrder[bestOrder.length - 1 - i] + 1).append(" ");
            }
        }

        System.out.println(str.toString());

    }

    private static long check(int[] heights, int[] order, int maxIndex, int workers, long minCost, int maxHeight) {

        long cost = 0;
        int[] tallestBoards = new int[workers];

        for (int i = 0; i <= maxIndex; i++) {

            if (i != 0 && order[i] == order[i - 1]) {
                return Long.MAX_VALUE;
            }

            if (tallestBoards[order[i]] < heights[i]) {
                cost += heights[i] - tallestBoards[order[i]];

                if (cost >= minCost) {
                    return Long.MAX_VALUE;
                }

                tallestBoards[order[i]] = heights[i];
            }

        }

        int highestSalary = 0;
        int highestSalaryIndex = 0;
        for(int i = 0; i < tallestBoards.length; i++){
            if(tallestBoards[i] > highestSalary){
                highestSalary = tallestBoards[i];
                highestSalaryIndex = i;
            }
        }
        
        int something = 0;
        for (int i = 0; i < tallestBoards.length; i++) {
            if(i != highestSalaryIndex)
                something += tallestBoards[i];
        }
        
        if(something + maxHeight > minCost)
            return Long.MAX_VALUE;

        return cost;
    }

}

Test details

Test 1

Group: 1

Verdict: ACCEPTED

input
10
22 54 3 91 69 90 40 29 83 71

correct output
174 3
2 1 2 1 2 1 2 1 2 1 

user output
174 2
1 2 1 2 1 2 1 2 1 2 

Test 2

Group: 1

Verdict: ACCEPTED

input
10
49 3 96 38 90 18 92 74 83 1

correct output
170 3
1 2 1 2 1 2 1 2 1 2 

user output
170 2
1 2 1 2 1 2 1 2 1 2 

Test 3

Group: 1

Verdict: ACCEPTED

input
10
46 3 41 30 16 17 12 93 80 81

correct output
173 3
2 1 2 1 2 1 2 1 2 1 

user output
173 2
2 1 2 1 2 1 2 1 2 1 

Test 4

Group: 1

Verdict: ACCEPTED

input
10
46 8 95 85 82 73 82 92 53 90

correct output
187 3
1 2 1 2 1 2 1 2 1 2 

user output
187 2
1 2 1 2 1 2 1 2 1 2 

Test 5

Group: 1

Verdict: ACCEPTED

input
10
41 18 61 59 40 96 5 2 74 38

correct output
159 3
2 1 2 1 2 1 2 3 1 2 

user output
159 3
1 2 1 2 1 2 1 3 2 1 

Test 6

Group: 1

Verdict: ACCEPTED

input
10
1 1 1 1 1 1 1 1 1 1

correct output
2 3
2 1 2 1 2 1 2 1 2 1 

user output
2 2
1 2 1 2 1 2 1 2 1 2 

Test 7

Group: 2

Verdict: ACCEPTED

input
100
1 39 94 5 24 84 84 10 78 61 38...

correct output
193 3
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ...

user output
193 2
2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 ...

Test 8

Group: 2

Verdict: ACCEPTED

input
100
31 73 18 88 49 28 66 5 32 48 9...

correct output
199 3
2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 ...

user output
199 2
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ...

Test 9

Group: 2

Verdict: ACCEPTED

input
100
45 56 36 60 31 10 23 79 29 17 ...

correct output
198 3
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ...

user output
198 2
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ...

Test 10

Group: 2

Verdict: ACCEPTED

input
100
1 77 70 62 21 68 40 54 90 62 1...

correct output
194 3
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ...

user output
194 2
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ...

Test 11

Group: 2

Verdict: ACCEPTED

input
100
4 47 41 81 56 64 12 10 20 100 ...

correct output
189 3
2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 ...

user output
189 3
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ...

Test 12

Group: 2

Verdict: ACCEPTED

input
10
1 1 1 1 1 1 1 1 1 1

correct output
2 3
2 1 2 1 2 1 2 1 2 1 

user output
2 2
1 2 1 2 1 2 1 2 1 2 

Test 13

Group: 3

Verdict: ACCEPTED

input
100
256160448 813097800 167146270 ...

correct output
1929869257 3
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ...

user output
1929869257 2
2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 ...

Test 14

Group: 3

Verdict: ACCEPTED

input
100
520002672 3542567 24668528 959...

correct output
1946957555 3
1 2 3 1 2 1 2 1 2 1 2 1 2 1 2 ...

user output
1946957555 3
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ...

Test 15

Group: 3

Verdict: ACCEPTED

input
100
483158423 780224665 844754665 ...

correct output
1959373560 3
2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 ...

user output
1959373560 3
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ...

Test 16

Group: 3

Verdict: ACCEPTED

input
100
969647264 128558017 889036329 ...

correct output
1997942264 3
2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 ...

user output
1997942264 2
2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 ...

Test 17

Group: 3

Verdict:

input
100
745018527 400495893 635468795 ...

correct output
1961391143 3
2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 ...

user output
(empty)

Test 18

Group: 3

Verdict: ACCEPTED

input
10
1 1 1 1 1 1 1 1 1 1

correct output
2 3
2 1 2 1 2 1 2 1 2 1 

user output
2 2
1 2 1 2 1 2 1 2 1 2 

Test 19

Group: 4

Verdict:

input
100000
197349274 775463806 263930657 ...

correct output
1999942635 3
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ...

user output
(empty)

Test 20

Group: 4

Verdict:

input
100000
102296405 34648120 320393597 9...

correct output
1999930943 3
2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 ...

user output
(empty)

Test 21

Group: 4

Verdict:

input
100000
781254921 418252056 502363453 ...

correct output
1999987794 3
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ...

user output
(empty)

Test 22

Group: 4

Verdict:

input
100000
849784881 230439009 455097426 ...

correct output
1999979439 3
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ...

user output
(empty)

Test 23

Group: 4

Verdict:

input
100000
851456132 13422224 537539701 4...

correct output
1999948226 3
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 ...

user output
(empty)

Test 24

Group: 4

Verdict:

input
100000
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ...

correct output
2 3
3 1 3 1 3 1 3 1 3 1 3 1 3 1 3 ...

user output
(empty)