Two Matchings

对于第一小,排序,然后求两个的差,即数组在(1,2)(3,4)......下标的差
对于第二小,还是排序,那么下来选4个数来进行(1,3)(2,4),但是可能会剩两个,所以对于每一个地方,只是4个不行,而是4个或6个来判断那个最小
6个的判断是(1,3)(2,5)(3,6)
然后对于第二种来写dp式子

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int t;
int n;
struct node
{
    ll v,id;
 } a[200005];
int cmp(node & a,node & b)
{
    return a.v<b.v||a.v==b.v&&a.id<b.id;     
}
ll dp[200005];
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%lld",&a[i]);
            a[i].id=i;
        }
        for(int i=1;i<=n;i++) dp[i]=2e10;
        sort(a+1,a+1+n,cmp);
        ll sum=0;      
        for(int i=2;i<=n;i+=2)
        {
            sum+=abs(a[i].v-a[i-1].v)   ;

        }

        for(int i=0;i<=n;i++)
        {
            if(i+4<=n) dp[i+4]=min(dp[i+4],dp[i]+a[i+4].v-a[i+1].v);
            if((i+6)<=n)
            {
                dp[i+6]=min(dp[i+6],dp[i]+abs(a[i+6].v-a[i+1].v));
            }

        }

        sum+=dp[n];
        printf("%lld\n",dp[n]*2);
    }
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务