题目链接
题意:
给一个数(位数不超过200000)。如今我们可以把这个切开,如:12388 我们可以切成123 88 等等。问我们最多能切出多少个数能被3整除。
思路:
1.能被3整除,即每个数的和为3的倍数。那么我们先贪心,所有能直接被3整除的数,直接切出来,(把更多的数让出来,贪心正确的原因)。
2.那么剩下的数,如果是一个俩位数,把其第一位模3,第二位模3,如果相加起来为3,则切出来(模数为 2 1 或者 1 2) ,则这个二位数一定会被3整除
3.如果不为3 (模数为 1 1 或者 2 2 只剩这俩种情况了)。
那么当这是个三位数的时候,前俩位的模数一定是(1 1 或者 2 2)这个第三位数不是1 就是 2 ,(因为0已经在第一种就切了) 当为1的时候 1 + 1 + 1 = 3,或者 2 + 1 = 3。得出结论,当为3位数的时候,一定被3整除了。
#include <bits/stdc++.h>
using namespace std;
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
string s;
cin >> s;
int len = s.size(),sum = 0,a = 0,b = 0,num = 0;
for(int i = 0;i < len;i++)
{
num = s[i]-'0';
if(num % 3 == 0) {sum++,a = 0,b = 0;continue;}
if(a && b) {sum++,a = 0,b = 0;continue;}
if(!a) a = num%3;
else if(!b) b = num%3;
if(a && b)
if(a + b == 3) sum++,a = 0,b = 0;
}
cout << sum << endl;
}