给定一个序列a1..a3n,求一个长3k的子序列ap1..ap3k,1≤p1<p2<..<p3k≤3n,使∑i=1..kmedium(ap3i−2,ap3i−1,ap3i)最大。medium 表示中位数。对k=1..n依次给出答案。
第一行1个正整数n
第二行3n个整数a1..a3n
一行n个整数,依次表示k=1..n的答案
3
1 2 3 1 2 3 1 2 3
3 5 6
【输入输出样例1说明】
k=3 时选 (3,3,3)
k=2 时选 (2,3,2,3,2,3)
k= 3时(只能)选整个原序列
最优方案不一定唯一
【数据规模与约定】
100%的数据,n≤6
#include<bits/stdc++.h>
using namespace std;
long long n,a[20005],p[20005],ans[20005],k,maxn=-1;
void cal()
{
long long sum=0,c=0,q[20005];
for(long long i=1;i<=3*n;i++)
if(p[i])
q[++c]=a[i];
for(long long i=1;i<=k;i++)
sum+=min(max(a[q[3*i-2]],a[q[3*i-1]]),a[q[3*i]]);
maxn=max(maxn,sum);
void dfs(long long x,long long cnt)
{
if(x==3*n+1)
{
if(!cnt) cal();
return;
}
if(cnt>0)
{
p[x]=1;
cnt--;
dfs(x+1,cnt);
cnt++;
}
p[x]=0;
dfs(x+1,cnt);
}
int main()
{
cin>>n;
for(long long i=1;i<=n*3;i++) cin>>a[i];
for(k=1;k<=n;k++)
{
maxn=-1;
dfs(1,k*3);
cout<<maxn<<" ";
for(int i=1;i<=3*k;i++) cout<<ans[i]<<" ";
cout<<endl;
}
return 0;
}