CF1859C Another Permutation Problem 题解

乍一看正解似乎不好想,因此我们先将 \(O(2^n)\) 的爆搜写出来。

然后将 \(n \in [1,10]\) 都跑一遍,结果如下:

\(n\) \(p\) 数组
\(1\) \(0\)
\(2\) \(2,1\)
\(3\) \(1,3,2\)
\(4\) \(1,2,4,3\)
\(5\) \(1,2,5,4,3\)
\(6\) \(1,2,3,6,5,4\)
\(7\) \(1,2,3,4,7,6,5\)
\(8\) \(1,2,3,4,8,7,6,5\)
\(9\) \(1,2,3,4,5,9,8,7,6\)
\(10\) \(1,2,3,4,5,6,10,9,8,7\)

通过上表可以看出,最优解的排列 \(p\) 总是形如 \(1,2,3,\cdot\cdot\cdot,k,n,n-1,\cdot\cdot\cdot,k+1\)\(0 \le k \le n\))。

于是我们枚举 \(k\) 的值,计算答案取最优解即可,时间复杂度 \(O(n^2)\)

#include<bits/stdc++.h>
using namespace std;
int t,n,ans,a[310];
int calc(){
int res1=0,res2=-1e9;
for(int i=1;i<=n;i++) res1+=a[i]*i;
for(int i=1;i<=n;i++) res2=max(res2,a[i]*i);
return res1-res2;
}
int main(){
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=n;i++) a[i]=i;
ans=-1e9;
for(int k=0;k<=n;k++){
for(int j=1;j<=k;j++) a[j]=j;
int x=k;
for(int j=n;j>=k+1;j--) a[j]=++x;
ans=max(ans,calc());
}
cout<<ans<<'\n';
}
return 0;
}
posted @   _XOFqwq  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示