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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】