把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

题解CF1729C

传送门 CF1729C

题意

每次可以从一个字符调至另一字符,花费加上其序号之差。从第一位调至最后一位,问:在满足最小花费的情况下,使走过的字符最多。

分析

  1. 最小值不可能小于从 $S_{1}$ 直接到达 $S_{n}$ 的花费。
  2. 可以从后面到达前面。

于是可以想到:所有在 $S_{1}\sim S_{n}$ 之间的字符我们都应当走过。

那么代码就十分简单了。 记录所有字符出现过的地方, 按照字符从 $S_{1}$ 一直到 $S_{n}$ 输出当前是字符的位置。


ans=abs(r-l);
if(l<=r) {
    for(int i=l; i<=r; ++i) cnt+=wh[i].size();
    cout<<ans<<" "<<cnt<<endl;
    for(int i=l; i<=r; ++i) for(int j=0; j<wh[i].size(); ++j)
            cout<<wh[i][j]<<" ";
    cout<<endl;
} else {
    for(int i=r; i<=l; ++i) cnt+=wh[i].size();
    cout<<ans<<" "<<cnt<<endl;
    for(int i=l; i>=r; --i) for(int j=0; j<wh[i].size(); ++j)
            cout<<wh[i][j]<<" ";
    cout<<endl;
}
posted @ 2022-11-21 21:13  djh0314  阅读(17)  评论(0)    收藏  举报  来源
浏览器标题切换
浏览器标题切换end