UVA10271,佳佳的筷子

来源:互联网 发布:网络运营经理岗位职责 编辑:程序博客网 时间:2024/05/17 03:59

传送门
首先把筷子长度排个序,可以证明配对的三根筷子中,一定最短的两根一定长度相邻(这就是红皮书上所谓的猜想吗?),然后乱搞一下就好了。
一开始数组小了,RE了一发。

#include<bits/stdc++.h>const int N=5010;typedef long long ll;const ll inf=1ll<<60;int T,n,k,i,j,s;ll f[N][N],a[N];inline void up(ll&a,ll b){    if(a>b)a=b;}int main(){    scanf("%d",&T);    while(T--){        scanf("%d%d",&k,&n);        k+=8;        s=2*k;        memset(f,0,sizeof f);        for(i=0;i<=n;++i){            for(j=0;j<=n-s;++j)f[i][j]=inf;            if(i)scanf("%lld",a+i);        }        std::sort(a+1,a+n+1);        f[n][0]=0;        for(i=n;i;--i)            for(j=0;j<=n-s;++j)                if(f[i][j]<inf){                    if(j<n-s)up(f[i-1][j+1],f[i][j]);                    if(i>1 && j)up(f[i-2][j-1],f[i][j]+(a[i]-a[i-1])*(a[i]-a[i-1]));                }        printf("%lld\n",f[0][n-s-k]);    }    return 0;}
原创粉丝点击