码题杯 平衡 题型:模拟 难度:白银

120 阅读2分钟

码题集OJ-平衡 (matiji.net)

思想

首先搞清楚本题里面的取模规则。

在模3规则下,−1、0、1是怎么变为2、0、1的?

-1%3==2,-1+3=2,2%3=2

0%3=0 ,0模任何数都为0

1%3==1,1模任何数都为任何数

样例解析

20102是怎么变为01210的?

我们从左向右依次遍历:

首先,因为第一位是2,所以我们接下来要进行的操作的是+1操作。需要先对字符串进行对3取模操作,变为20102,然后再进行+1操作变为01210(3进制满3进1) image.png

然后我们再看01210是怎么变为00102的?

首先01210的第一位是0,我们可以跳过。然后第二位是1,因此我们接下来要当前位和以后的位进行-1操作。

当前位1对3取模还是1,然后-1变为0,此时为00210。然后是第三位2,我们对其取模变为2,进行-1操作变为1,此时为00110。然后是第四位1,我们对其取模后再减1,变为0,此时为00100。然后是第五位0,我们对其取模之后减去1,就是0-1,因为是3进制,所以就是3-1,就是2,此时为00102。

image.png

code

代码部分我们模拟写就行了,遇到首位为1我们就进行-1操作,遇到首位为0的就进行加1操作。

然后遍历位和之后的每一位,看一下是多少,给出对应的经过运算之后的值。

#include <bits/stdc++.h>
using namespace std;
int ans;

int main() {

	string s;
	cin >> s;

	for (int i = 0; i < s.size(); i++) {
		//若当前数字为1,那么就进行-1操作

		int n = s.size();
		if (s[i] == '1') {
			for (int j = i; j <= n; j++) {
				//题目给的字符串只会出现0,1,2的情况
				switch (s[j]) {
					case '1':
						s[j] = '0';
						break;
					case '2':
						s[j] = '1';
						break;
					case '0':
						s[j] = '2';
						break;
				}
			}
			ans++;
		} else if (s[i] == '2') { //若是2那么就要进行+1的操作
			for (int j = i; j <= n; j++) {
				switch (s[j]) {
					case '1':
						s[j] = '2';
						break;
					case '2':
						s[j] = '0';
						break;
					case '0':
						s[j] = '1';
						break;
				}
			}
			ans++;
		}

	}

	cout << ans << endl;
	return 0;
}

image.png