Untitled

 avatar
unknown
plain_text
a year ago
3.1 kB
5
Indexable
#include <iostream>

using namespace std;

// Hàm để tính tổng khoảng cách di chuyển của hành khách từ một cửa
int calculateDistance(int N, int startPos, int numPassengers, bool seats[]) {
    int totalDistance = 0;
    for (int i = 0; i < numPassengers; ++i) {
        int distance = 1;
        while (true) {
            // Kiểm tra vị trí ngồi bên trái và phải của cửa
            if ((startPos - distance >= 0 && !seats[startPos - distance]) || (startPos + distance < N && !seats[startPos + distance])) {
                if (startPos - distance >= 0 && !seats[startPos - distance]) {
                    totalDistance += distance;
                    seats[startPos - distance] = true;
                } else if (startPos + distance < N && !seats[startPos + distance]) {
                    totalDistance += distance;
                    seats[startPos + distance] = true;
                }
                break;
            }
            distance++;
        }
    }
    return totalDistance;
}

// Hàm để sắp xếp một mảng có 3 phần tử
void sortOrder(int arr[], int size) {
    for (int i = 0; i < size - 1; ++i) {
        for (int j = 0; j < size - 1 - i; ++j) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

// Hàm để tìm tất cả các hoán vị của mảng
void nextPermutation(int arr[], int size) {
    int i = size - 2;
    while (i >= 0 && arr[i] >= arr[i + 1]) {
        i--;
    }
    if (i >= 0) {
        int j = size - 1;
        while (arr[j] <= arr[i]) {
            j--;
        }
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
    for (int k = i + 1, l = size - 1; k < l; k++, l--) {
        int temp = arr[k];
        arr[k] = arr[l];
        arr[l] = temp;
    }
}

int main() {
    int T;
    cin >> T;
    
    for (int caseNum = 1; caseNum <= T; ++caseNum) {
        int N;
        cin >> N;
        
        int positions[3], passengers[3];
        for (int i = 0; i < 3; ++i) {
            cin >> positions[i] >> passengers[i];
            positions[i]--; // Để vị trí bắt đầu từ 0
        }
        
        int minDistance = 999999; // Giá trị lớn ban đầu
        int order[3] = {0, 1, 2};
        
        // Duyệt tất cả các thứ tự mở cửa
        do {
            bool seats[60] = {false}; // Mảng trạng thái ghế trống
            
            int currentDistance = 0;
            for (int i = 0; i < 3; ++i) {
                currentDistance += calculateDistance(N, positions[order[i]], passengers[order[i]], seats);
            }
            
            if (currentDistance < minDistance) {
                minDistance = currentDistance;
            }
            
            // Tìm hoán vị kế tiếp
            nextPermutation(order, 3);
        } while (!(order[0] == 0 && order[1] == 1 && order[2] == 2));
        
        cout << "Case #" << caseNum << "\n" << minDistance << "\n";
    }
    
    return 0;
}
Editor is loading...
Leave a Comment