题意: 从(0,0)-(n,n) 每一走变换方向,类似楼梯。每以条路有权值。第i条路的权值为
C
i
C_i
Ci,规划路径,求最小
∑
l
e
n
i
∗
C
i
\sum len_i*C_i
∑leni∗Ci
题解:不妨考虑走i条路径走到(n,n) ,奇偶分类,让奇子列中最小的最长,偶子列最小的最长。很容易证明正确性。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
priority_queue<int,vector<int> ,greater<int>> q[2];
int a[N];
ll ans=0,sum[2];
int cas,n;
int main(){
scanf("%d",&cas);
while(cas--){
while(!q[0].empty()) q[0].pop();
while(!q[1].empty()) q[1].pop();
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
// ;q[1].clear();
q[1].push(a[1]);
q[0].push(a[2]);
ans=1ll*a[1]*n+1ll*a[2]*n;
sum[1]=a[1];
sum[0]=a[2];
for(int i=3;i<=n;i++){
q[(i&1)].push(a[i]);
sum[(i&1)]+=a[i];
int cnt1=0;int cnt0=0;
if(i&1){
cnt1=(i+1)>>1;
cnt0=i-cnt1;
}else{
cnt0=i/2;
cnt1=i-cnt0;
}
// printf("%d %d\n",cnt0,cnt1);
ans=min(ans,sum[0]+sum[1]+1ll*(n-cnt0)*q[0].top()+1ll*(n-cnt1)*q[1].top());
}
cout<<ans<<endl;
}
return 0;
}