题意: 给你一个字符串,然后让你尽可能多的去分解这个字符串 使得每一个分解出来的子串的和都是3的倍数
思路: 同余
对于单独的一个数字而言 如果是三的倍数 则 ans++
否则 去考虑连续的两个数字 如果是 则 ans++
否则 考虑连续的三个数字
如果第三个数字本身就是3的倍数 则ans++
如果第三个数字不是3的倍数 那对于前两个数字x y 来说
x y 对3求余只有两种情况 [1,1] [2,2] 不可能是[2,1],[1,2]这两个 因为如果是后面这两个情况的话 那x+y就是3的倍数 因为(1+2)%3=0
对于前两种情况 第三个数字对3取余的可能性有3中 0 1 2
0: 本身就是3的倍数 ans++
1: 1 1 1 取全部 是三的倍数 2 2 1 取后面的两个 所以 一定能找到一个和是3的倍数
2: 1 1 2 取后面两个 2 2 2 取全部 同理
所以 对于n=3的时候 一定可以找到
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
using namespace std;
const int N = 2e5+10;
char str[N];
int main() {
while(~scanf("%s", str)){
int len = strlen(str);
int ans = 0, tmp = 0, sum = 0, n = 0;
for(int i = 0; i < len; i ++) {
tmp = (str[i]-'0') % 3;
sum += tmp;
n++;
if(tmp == 0 || sum%3==0 || n == 3) {
ans++;
sum = n = 0;
}
}
cout << ans << endl;
}
return 0;
}