Untitled
unknown
c_cpp
a year ago
2.8 kB
8
Indexable
#include <iostream> using namespace std; int t, n; int ans = (int)1e9; const int MN = 60; const int MP = 3; int vis[MN], per[MN]; int p[MN], c[MN]; int mark_sat[MN]; bool is_valid(int num) { return 1 <= num && num <= n; } void sort_per(int i, int cost) { if (cost > ans) { return; } if (i == MP) { ans = min(ans, cost); return; } int num_person = c[per[i]]; int idx_person = p[per[i]]; int k = 1; int sum = 0; if (mark_sat[idx_person] == 0) { mark_sat[idx_person] = i + 1; sum += 1; num_person--; } while (num_person > 0) { int left = idx_person - k; int right = idx_person + k; if (num_person == 1 && is_valid(left) && is_valid(right) && !mark_sat[left] && !mark_sat[right]) { num_person--; mark_sat[left] = i + 1; sum += 1 + k; sort_per(i + 1, cost + sum); sum -= 1 + k; num_person++; mark_sat[left] = 0; for (int j = 1; j <= n; ++j) { if (i + 1 < mark_sat[j]) { mark_sat[j] = 0; } } num_person--; mark_sat[right] = i + 1; sum += 1 + k; sort_per(i + 1, cost + sum); sum -= 1 + k; num_person++; mark_sat[right] = 0; for (int j = 1; j <= n; ++j) { if (i + 1 < mark_sat[j]) { mark_sat[j] = 0; } } return; } if (num_person > 0 && is_valid(left) && !mark_sat[left]) { num_person--; mark_sat[left] = i + 1; sum += 1 + k; } if (num_person > 0 && is_valid(right) && !mark_sat[right]) { num_person--; mark_sat[right] = i + 1; sum += 1 + k; } k++; } sort_per(i + 1, cost + sum); } void permutation(int i) { if (i == MP) { for (int j = 1; j <= n; ++j) { mark_sat[j] = 0; } sort_per(0, 0); return; } for (int j = 0; j < MP; ++j) { if (!vis[j]) { vis[j] = 1; per[i] = j; permutation(i + 1); vis[j] = 0; } } } int main() { // freopen("hugo_di_tau.txt", "r", stdin); cin >> t; for (int test_case = 1; test_case <= t; ++test_case) { cin >> n; for (int i = 0; i < MP; ++i) { cin >> p[i] >> c[i]; } ans = (int)1e9; permutation(0); cout << "Case #" << test_case << '\n'; cout << ans << '\n'; } return 0; }
Editor is loading...
Leave a Comment