比赛 |
20150423 |
评测结果 |
AAWTTTTTTTTTTTT |
题目名称 |
马拉松2 |
最终得分 |
13 |
用户昵称 |
Satoshi |
运行时间 |
12.002 s |
代码语言 |
C++ |
内存使用 |
1.28 MiB |
提交时间 |
2015-04-23 11:00:00 |
显示代码纯文本
#include <fstream>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
ifstream in("marathonb.in");
ofstream out("marathonb.out");
int skip[501][501]={0},T,n;
int f[501]={0};
bool l[501]={0};
long long best=9999999,ans=0;
class node
{
public:
int x,y;
}po[501]={0};
int disa(node a,node b)
{
int s=0;
s=abs(a.x-b.x);
s+=abs(a.y-b.y);
return s;
}
void print()
{
int i;
for(i=1;i<=n;i++)out<<f[i]<<' ';
out<<endl;
}
void check()
{
int i,j;
vector<int> q;
long long ans2=0;
for(i=1;i<=n;i++)if(f[i]==0)q.push_back(i);
for(i=0;i<q.size()-1;i++)ans2+=skip[q[i]][q[i+1]];
if(ans2<best)best=ans2;
}
void check2()
{
int i;
long long ans2=0;
vector<int> q;
q.push_back(1);
for(i=2;i<=n-1;i++)if(f[i])q.push_back(i);
q.push_back(n);
for(i=0;i<q.size()-1;i++)
{
ans2+=skip[i][i+1];
}
if(ans2<best)best=ans2;
}
int dfs(int sum,int data)
{
int i;
//out<<T<<' ';
if(data==T)
{
//print();
check();
return 0;
}
if(sum==n)return 0;
f[sum]=1;
dfs(sum+1,data+1);
f[sum]=0;
dfs(sum+1,data);
return 0;
}
int bfs(int sum,int data)
{
int i;
//out<<sum<<' '<<data<<endl;
//out<<T<<' ';
//out<<n-T<<endl;
if(data==n-T)
{
//print();
check2();
return 0;
}
if(sum==n)return 0;
f[sum]=1;
//out<<sum<<endl;
bfs(sum+1,data+1);
f[sum]=0;
bfs(sum+1,data);
return 0;
}
int main()
{
int i,j,k;
in>>n>>T;
for(i=1;i<=n;i++)in>>po[i].x>>po[i].y;
for(i=1;i<=n-1;i++)
{
for(j=i+1;j<=n;j++)
{
skip[i][j]=disa(po[i],po[j]);
skip[j][i]=disa(po[i],po[j]);
}
}
//out<<k<<endl;
if(T==n-2)
{
out<<skip[1][n]<<endl;
return 0;
}
if(T<n-T)dfs(2,0);
for(i=1;i<=n;i++)f[i]=0;
if(T>=n-T)bfs(2,2);
out<<best<<endl;
return 0;
}