2020牛客暑期多校训练营第三场Two Matchings

Two Matchings

原题传送门

题目大意:

长度为n的排列是一个数组p = [p1,p2,…,pn] ,其中每个整数从1到 n(含),每个数字恰好出现一次。 例如,p = [3,1,4,6,2,5]是长度为6的排列。我们称一个排列是一个匹配,当且仅当对于任意i在这里插入图片描述
给定一个数组a = [a1,a2,…,an] (0≤ai≤10^9,n≥4并且n是偶数)。 定义排列的成本为
在这里插入图片描述
定义两个匹配是可组合的,当且仅当对于任意i,在这里插入图片描述

请找到两个可组合的匹配,以使这两个匹配项的总成本尽可能小。 输出总和。

输入:

第一行输入一个整数t(1≤t≤5×10^4),表示测试数据的组数
在每一组测试数据中,第一行输入一个整数n(n>4&&n%2=0)接下来一行输入n个整数a1,a2,…,an(0≤ai≤10^9)
测试用例中n的总和不超过2×10^5

输出:

对于每个测试,输出一行仅包含一个代表该测试答案的整数。

样例输入:

2
4
0 8 0 0
6
3 1 4 1 5 9

样例输出:

16
16

AC Code

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN=2e5+5;
ll b[MAXN],a[MAXN],dp[MAXN];
int t,n;
int main(){
    dp[2]=1e9+7;
    for(scanf("%d",&t);t--;){
        scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%lld",a+i);
        sort(a+1,a+n+1);
        for(int i=4;i<=n;i+=2){
            dp[i]=dp[i-4]+a[i]-a[i-3];
            if(i>=6) dp[i]=min(dp[i],dp[i-6]+a[i]-a[i-5]);
        }
        printf("%lld\n",dp[n]*2);
    }
}

猜你喜欢

转载自blog.csdn.net/s260127ljy/article/details/107450601