Cod sursa(job #3253037)

Utilizator emamsema marginean emams Data 31 octombrie 2024 23:09:19
Problema Barman Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
#include <cmath>
#include <fstream>

using namespace std;


int calculate_min_time(const vector<int>& drinks, int N) {
    vector<int> sorted_drinks = drinks;
    sort(sorted_drinks.begin(), sorted_drinks.end());

    int min_time = INT_MAX;


    for (int start = 0; start < N; ++start) {
        int current_time = 0;
        vector<bool> used(N, false);


        for (int i = 0; i < N; ++i) {
            int target_value = sorted_drinks[(start + i) % N];
            int current_pos = -1;


            for (int j = 0; j < N; ++j) {
                if (drinks[j] == target_value && !used[j]) {
                    current_pos = j;
                    used[j] = true; // Marcare pahar folosit
                    break;
                }
            }


            if (current_pos != -1) {
                int target_pos = (start + i) % N;
                int distance = min(abs(target_pos - current_pos), N - abs(target_pos - current_pos));
                current_time += distance + 20;
            }
        }


        min_time = min(min_time, current_time);
    }

    return min_time;
}

int main() {
    ifstream fin("barman.in");
    ofstream fout("barman.out");

    int N;
    fin >> N;

    vector<int> drinks(N);
    for (int i = 0; i < N; ++i) {
        fin >> drinks[i];
    }

    int result = calculate_min_time(drinks, N);
    fout << result << "\n";

    fin.close();
    fout.close();

    return 0;
}