题解CF1729C
传送门 CF1729C
题意
每次可以从一个字符调至另一字符,花费加上其序号之差。从第一位调至最后一位,问:在满足最小花费的情况下,使走过的字符最多。
分析
- 最小值不可能小于从 $S_{1}$ 直接到达 $S_{n}$ 的花费。
- 可以从后面到达前面。
于是可以想到:所有在 $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;
}

浙公网安备 33010602011771号