题目链接:https://vjudge.net/problem/CodeForces-1005D
题目大意
给定一个不超过2*10^5长度的字符串,将字符串进行切割,问最大能够得到多少个被3整除的数字。
分析
如果一个数字能被3整除,那么这个数字的各位数字之和必能被3整除。从头开始,计算每一位数字之和,如果能被3整除,那么ans++;如果不能被3整除,就看看之前有没有出现过这个数字(取模之后的),如果出现过,就说明加了一个能被3整除的数,ans++。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 200005;
char s[N];
int mark[3];
int main()
{
while(~scanf("%s", s))
{
mark[0] = 1;
mark[1] = 0;
mark[2] = 0;
int ans = 0, cnt = 0;
int len = strlen(s);
for(int i = 0; i < len; i++)
{
cnt = cnt + s[i] - '0';
cnt %= 3;
if(mark[cnt])
{
ans++;
mark[1] = 0;
mark[2] = 0;
cnt = 0;
}
else
{
mark[cnt] = 1;//标记,下次如果出现cnt,说明加了一个3的倍数
}
}
printf("%d\n", ans);
}
return 0;
}