Cod sursa(job #2676762)

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

using namespace std;

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

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

int dist1(int i, int 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);
}

int dist2(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)
                        {   for(int bit1=0; bit1<n; bit1++)
                                val = min(val, dist1(bit+1, bit1+1) + dp[0][bit1]);
                        }
                    else
                        {   for(int 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;
                }
    int ans = inf;
    for(int 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};
    while(1)
        {   int type;
            f >> type;
            if(!type)
                n++, f >> v[n].first >> v[n].second;
            else if(type == 1)
                {   solve();
                    for(int i=1; i<=n; i++) pr[i] = v[i];
                    n = 0;
                }
            else return 0;
        }
    return 0;
}