Cod sursa(job #2557930)
Utilizator | Data | 26 februarie 2020 09:50:46 | |
---|---|---|---|
Problema | Bibel | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | sim11_1 | Marime | 2.44 kb |
#include <fstream>
using namespace std;
long long mlc,n,m,i,j,nr,val,p,mini,x[20],y[20],x2[20],y2[20],b[20],d[20][250005];
int main()
{
ifstream f("bibel.in");
ofstream g("bibel.out");
while(f>>mlc)
{
if(mlc==2) return 0;
if(mlc==0)
{
n++;
f>>x[n]>>y[n];
}
else
{
for(i=1; i<=n; i++)
{
b[i]=d[1][val]+(x[i]-x2[1])*(x[i]-x2[1])+(y[i]-y2[1])*(y[i]-y2[1]);
for(j=2; j<=m; j++)
{
b[i]=min(b[i],d[j][val]+(x[i]-x2[j])*(x[i]-x2[j])+(y[i]-y2[j])*(y[i]-y2[j]));
}
}
for(i=1; i<=m; i++)
for(j=1; j<=val; j++) d[i][j]=0;
p=1;
for(i=n; i>=1; i--)
{
d[i][p]=b[i];
b[i]=0;
p*=2;
}
b[n]=1;
val=1;
nr=1;
while(b[0]==0)
{
if(nr>1)
{
i=n;
p=1;
while(i)
{
if(b[i]==1)
{
d[i][val]=-1;
b[i]=0;
for(j=1; j<=n; j++)
{
if(b[j]==1&&(d[i][val]==-1||d[i][val]>d[j][val-p]+(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])))
d[i][val]=d[j][val-p]+(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
}
b[i]=1;
}
i--;
p*=2;
}
}
i=n;
while(b[i])
{
b[i]=0;
nr--;
i--;
}
nr++;
b[i]=1;
val++;
}
b[0]=0;
val--;
mini=d[1][val];
for(i=2; i<=n; i++) mini=min(mini,d[i][val]);
g<<mini<<'\n';
for(i=1; i<=n; i++)
{
x2[i]=x[i];
y2[i]=y[i];
x[i]=0;
y[i]=0;
}
m=n;
n=0;
}
}
return 0;
}