比赛 |
20101101 |
评测结果 |
AAAAAAAAAA |
题目名称 |
奇怪的监狱 |
最终得分 |
100 |
用户昵称 |
苏轼 |
运行时间 |
0.014 s |
代码语言 |
C++ |
内存使用 |
3.19 MiB |
提交时间 |
2012-11-05 11:01:46 |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
int n,m,q[105][105]={0};
int w[105]={0};
int cmp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
int main()
{
freopen ("prison.in","r",stdin);
freopen ("prison.out","w",stdout);
cin>>n>>m;
for (int i=1;i<=m;i++)
{
cin>>w[i];
}
w[0]=0;
w[m+1]=n+1;
qsort(w,m+2,sizeof(w[0]),cmp);
for (int i=0;i<=m+1;i++)
for (int j=i;j<=m+1;j++)
q[i][j]=9999999;
for (int i=0;i<m+1;i++)
{
q[i][i+1]=w[i+1]-w[i]-1;
}
for (int i=0;i<m;i++)
{
q[i][i+2]=w[i+2]-w[i]-2;
}
for (int j=3;j<=m+1;j++)
{
for (int i=0;i<m;i++)
{
if (i+j>m+1)
break;
for (int k=i+1;k<i+j;k++)
{
if (k==i+1)
{
q[i][i+j]=min(q[i][i+j],q[k][i+j]+w[i+j]-w[i]-2);
continue;
}
if (k==i+j-1)
{
q[i][i+j]=min(q[i][i+j],q[i][k]+w[i+j]-w[i]-2);
continue;
}
q[i][i+j]=min(q[i][i+j],q[i][k]+q[k][i+j]+w[i+j]-w[i]-2);
}
}
}
cout<<q[0][m+1];
return 0;
}