Cod sursa(job #2676560)

Utilizator FrostfireMagirescu Tudor Frostfire Data 24 noiembrie 2020 16:28:16
Problema Bibel Scor 10
Compilator cpp-64 Status done
Runda simusimu Marime 1.36 kb
#include <iostream>
#include <fstream>
#define inf 2000000000

using namespace std;

ifstream f("bibel.in");
ofstream g("bibel.out");

int n = 0, dp[(1<<17)+10][17];
pair <int, int> v[20];

int dist(int i, int j)
{   return (v[i].first - v[j].first) * (v[i].first - v[j].first) + (v[i].second - v[j].second) * (v[i].second - v[j].second);
}

void solve()
{   for(int mask=1; mask<(1<<n); mask++)
        for(int bit=0; bit<n; bit++)
            if(mask & (1 << bit))
                {   int val = inf;
                    if(__builtin_popcount(mask) == 1) val = dist(0, bit+1);
                    else
                        {   for(int bit1=0; bit1<n; bit1++)
                                if(bit1 != bit && (mask & (1 << bit1)))
                                    val = min(val, dp[mask^(1<<bit)][bit1] + dist(bit1+1, bit+1));
                        }
                    dp[mask][bit] = val;
                }
    int ans = inf;
    for(int i=0; i<n; i++) ans = min(ans, dp[(1<<n)-1][i]);
    g << ans << '\n';
}

int main()
{
    v[0] = {0, 0};
    while(1)
        {   int type;
            f >> type;
            if(!type)
                n++, f >> v[n].first >> v[n].second;
            else if(type == 1)
                {   solve();
                    n = 0;
                }
            else return 0;
        }
    return 0;
}