Codeforces Round #496 (Div. 3) D题 Polycarp and Div 3思维

题目链接
题意:
给一个数(位数不超过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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值