• Codeforces #496 (Div. 3) Polycarp and Div 3


    思路1: https://blog.csdn.net/qq_41730082/article/details/80984316

            题目的意思是给你一串数字长度为(1~2e5),当然由于它的这一串数字是不打空格的输入,所以我用了string 定义了个字符串然后仅需要对字符串操作即可。题目要求得到的是:给你一串数组,你要找的是这串数组上能有多少段能被3整除的数,譬如3121,可以分成「3」、「1、2」、「1」,但最后的时候由于1不是3的倍数,所以ans=2;再举个有0的例子,100000可以分成「1」、「0」、「0」、「0」、「0」、「0」,ans=5,这里要考虑到的就是0也是3的倍数。

            思路:我们可以看到这样一个现状:

    (一)、假如这个数可以被3整除,那么前面的数作废,开始判断后面的数

    (二)、假如第一个数不能被三整除,那么考虑第二个数,若是不能被三整除,则看他们两个数的和,他们的与3分别的余数只有「1,1」、「1,2」、「2,2」这么三种情况,若是「1,2」到这就可以停下来,重新开始判断下一个了,否则无论是上述1、3情况下的哪一种都会被第三个一起给3整除掉,举个例子如果下一个数%3=1,遇上情况1,三个数和一定为三的倍数;情况2,第二个数和第三个数一定为三的倍数。所以每个式子长度不过三。

    思路:一个数是3的倍数,则各位的和能被3整除。

    对于单独的一个数字,如果是3的倍数,则ans++

    否则,考虑连续的两个数字,如果是,则ans++

    如果第三个数本身是3的倍数,则ans++

    如果第三个数不是3的倍数,则对于前两个数的和对3取余,结果为[1,1]或者[2,2](如果为[1,2],[2,1],则这两个数字能够被3整除)

    对于第三个数对3取余,结果为0,1,2

    0:第三个数本身能被3整除ans++

    1:[1,1,1]是3的倍数取全部,[2,2,1]取后两个   ans++

    2:[1,1,2]取后两个 [2,2,2]是3的倍数,取全部  ans++

    所以 对于n=3 一定可以找到

     1 #include<iostream>
     2 #include<cstdio>
     3 #include <cctype>
     4 #include<algorithm>
     5 #include<cstring>
     6 #include<cmath>
     7 #include<string>
     8 #include<cmath>
     9 #include<set>
    10 #include<vector>
    11 #include<stack>
    12 #include<queue>
    13 #include<map>
    14 using namespace std;
    15 #define ll long long
    16 #define mem(a,x) memset(a,x,sizeof(a))
    17 #define se second
    18 #define fi first
    19 const int INF= 0x3f3f3f3f;
    20 const int N=1e6+5;
    21 
    22 string s;
    23 
    24 int main()
    25 {
    26     cin>>s;
    27     int be;
    28     int len=s.length();
    29     int flag=0;
    30     for(int i=0;i<len;i++){
    31         if(s[i]!='0'){
    32             be=i;
    33             flag=1; break;
    34         }
    35     }
    36     if(flag==0){
    37         cout<<1; return 0;
    38     }
    39     int cnt=0,ans=0,sum=0;
    40     for(int i=be;i<len;i++)
    41     {
    42         sum+=s[i]-'0';
    43         cnt++;
    44         if(cnt>=3 || sum%3==0 || (s[i]-'0')%3==0)
    45         {
    46             sum=0,cnt=0,ans++;
    47         }
    48     }
    49     cout<<ans;
    50 }
  • 相关阅读:
    第3课 线性分类器损失函数与最优化
    李飞飞机器视觉课程笔记:第2课 K最近邻与线性分类器
    周志华《机器学习》第二章学习笔记
    通过anaconda安装tensorflow
    周志华《机器学习》第一章学习笔记 奥卡姆剃刀原理、没有免费的午餐定理(NFL)、回归模型
    DPM目标检测模型
    损失函数的理解
    mini-batch的理解
    前向传播、后向传播
    SVM(支持向量机)的理解
  • 原文地址:https://www.cnblogs.com/thunder-110/p/9480104.html
Copyright © 2020-2023  润新知