Cod sursa(job #2676765)

Utilizator FrostfireMagirescu Tudor Frostfire Data 24 noiembrie 2020 22:17:23
Problema Bibel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <iostream>
#include <fstream>
#define inf 2000000000

using namespace std;

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

typedef long long ll;
ll n = 0, n1 = 0, t, dp[(1<<17)+10][17];
pair <ll, ll> v[20], pr[20];

ll dist1(ll i, ll j)
{   return (v[i].first - pr[j].first) * (v[i].first - pr[j].first) + (v[i].second - pr[j].second) * (v[i].second - pr[j].second);
}

ll dist2(ll i, ll 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(ll mask=1; mask<(1<<n); mask++)
        for(ll bit=0; bit<n; bit++)
            if(mask & (1 << bit))
                {   ll val = inf;
                    if(__builtin_popcount(mask) == 1)
                        {   for(ll bit1=0; bit1<n1; bit1++)
                                val = min(val, dist1(bit+1, bit1+1) + dp[0][bit1]);
                        }
                    else
                        {   for(ll bit1=0; bit1<n; bit1++)
                                if(bit1 != bit && (mask & (1 << bit1)))
                                    val = min(val, dp[mask^(1<<bit)][bit1] + dist2(bit1+1, bit+1));
                        }
                    dp[mask][bit] = val;
                }
    ll ans = inf;
    for(ll i=0; i<n; i++) ans = min(ans, dp[(1<<n)-1][i]), dp[0][i] = dp[(1<<n)-1][i];
    g << ans << '\n';
}

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