C. Sum of Substrings
https://codeforces.com/problemset/problem/1691/C
题意:给定长度为n的字符串s只包含0跟1,每次操作可以交换相邻的字符串的位置,求操作后所有的s.substr(i, i + 1)的数的和最小是多少。
思路:假如位置n - 1不是1,那么把最后一个1放到这个位置,可以让总和中的贡献少一个10。如果位置0不是1,把第一个1放到最前面,可以让总和贡献少1(当前的1不能是最后一位的1)。
总结:第一天看题目写了很多规则出来,但是仍然总有示例过不去。第二天再看题目恍然大悟,属于是靠知觉解题。 要深刻的理解这个题目的套路,必须得了解操作的特性:特性思路所示,但是在第一次思考的时候陷入了一个误区,就是0010100,改为0011000的必要性?之前是1 + 10 + 1 + 10,改为后是1 + 11 + 10,其实都是22,这种改变是完全不会影响最终结果的。所以就是说,影响最终结果的操作只分两种,意识到这一点就简单了。
inline void solve() {
int n, k;
cin >> n >> k;
string s;
cin >> s;
if (s.back() != '1') {
size_t pos = s.find_last_of('1');
if (pos != s.npos && (n - pos - 1) <= k) {
swap(s.back(), s[pos]);
k -= (n - 1 - pos);
}
}
if (s[0] != '1') {
size_t pos = s.find('1');
if (pos != s.npos && pos != n - 1 && pos <= k) {
swap(s[0], s[pos]);
}
}
int ans = 0;
for (int i = 0; i < n - 1; ++i) {
ans += stoi(s.substr(i, 2));
}
cout << ans << '\n';
}

浙公网安备 33010602011771号