Cod sursa(job #2976806)

Utilizator VmanDuta Vlad Vman Data 10 februarie 2023 04:13:44
Problema Bibel Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

inline int sqr(int a) { return a * a; }

void solve(vector<pair<int,int> > &v, pair<int, int> start, int startDist, vector<int> &res) {
    vector<int> p;
    for (int i = 0; i < v.size(); ++i) {
        p.push_back(i);
    }
    int best = 2000000000;
    do {
        pair<int, int> pos = start;
        int dist = startDist;
        for (auto it : p) {
            pair<int, int> next = v[it];
            dist += sqr(pos.first - next.first) + sqr(pos.second - next.second);
            pos = next;
        }
        //cout << pos.first << " " << pos.second << " " << dist << endl;
        if (dist < res[p[p.size() - 1]]) {
            res[p[p.size() - 1]] = dist;
        }
    } while (next_permutation(p.begin(), p.end()));
}

int main() {
    freopen("bibel.in", "r", stdin);
    freopen("bibel.out", "w", stdout);
    
    int op;
    vector<pair<int,int> > level;
    vector<pair<int,int> > prevLevel;
    vector<int> prevRes(1);
    prevLevel.push_back(make_pair(0, 0));
    while (true) {
        cin >> op;
        if (op == 2) {
            return 0;
        }
        
        if (op == 1) {
            vector<int> res(level.size(), 2000000000);
            
            for (int i = 0; i < prevLevel.size(); ++i) {
                solve(level, prevLevel[i], prevRes[i], res);
            }
            prevRes = res;
            prevLevel = level;
            level.clear();
            
            int best = res[0];
            for (auto it : res) {
                best = min(best, it);
            }
            cout << best << "\n";
            
            continue;
        }
        
        int x, y;
        cin >> x >> y;
        level.push_back(make_pair(x, y));
    }
    
    return 0;
}