记录编号 39344 评测结果 AAAAAAAAAA
题目名称 磁性链 最终得分 100
用户昵称 GravatarCitron酱 是否通过 通过
代码语言 C++ 运行时间 0.004 s
提交时间 2012-07-09 15:11:31 内存使用 0.29 MiB
显示代码纯文本
#include <cstdio>
#include <climits>
 
#define I_F "linka.in"
#define O_F "linka.out"
 
const int MAXq=100+2;
 
int n, q;
int p[MAXq], s[MAXq];
int ans;
 
void Input();
template<typename Any>
inline void Swap(Any&, Any&);
void Sort();
void Prework();
inline int Min(const int&, const int&);
void Dynap();
void Output();
 
int main()
{
    Input();
    Sort();
    Prework();
    Dynap();
    Output();
    return 0;
}
 
void Input()
{
    freopen(I_F,"r",stdin);
    scanf("%d%d",&n,&q);
    for (int i=0; i<q; ++i)
        scanf("%d",&p[i]);
}
 
template<typename Any>
inline void Swap(Any &a, Any &b)
{
    Any t=a;
    a=b;
    b=t;
}
 
void Sort()
{
    for (int i=0; i<q; ++i)
        for (int j=q-1; j>i; --j)
            if (p[j]<p[j-1])
                Swap(p[j],p[j-1]);
}
 
void Prework()
{
    s[0]=0;
    for (int i=1; i<=q; ++i)
        s[i]=p[i-1]-i;
    s[q+1]=n-q;
}
 
inline int Min(const int &a, const int &b)
{
    return (a<b)?a:b;
}
 
void Dynap()
{
    int r;
    int f[MAXq][MAXq]={{0}};
    for (int i=2; i<=q+1; ++i)
        for (int j=1; j<=q-i+2; ++j)
        {
            r=j+i-1;
            f[j][r]=INT_MAX;
            for (int k=j; k<r; ++k)
                f[j][r]=Min(f[j][r],f[j][k]+f[k+1][r]);
            f[j][r]+=s[r]-s[j-1]+i-2;
        }
    ans=f[1][q+1];
}
 
void Output()
{
    freopen(O_F,"w",stdout);
    printf("%d\n",ans);
}