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';
}
posted @ 2025-04-26 09:44  _Yxc  阅读(10)  评论(0)    收藏  举报