• ZZNU 压死骆驼的最后一根稻草 规律题


    J : 压死骆驼的最后一根稻草

     
    Progress Bar

    时间限制:1 Sec 内存限制:128 MiB
    提交:179 答案正确:34

     

     


    题目描述

    每个人 都有自己独有的计数方式  比如以下  字符串111123455可以表示为4个1,1个2,1个3,1个4,2个5.为了方便记忆就表示为4--1,1--2,1--3,1--4,2--5当然顺序肯定不能变换  计数方式可以表示为“a--b”的形式  在计数方式中相连的b互不相等且a与b不为0   独有的计数方式 如果转化为字符串  字符串的长度小于10的9次方

    给你下面的计数方式    例如5--4也就是字符串44444,10--4也就是字符串4444444444

    给你这样的计数方式  判断这个字符串中有多少连续子串所构成的整数是4的倍数

    例如5--4可表示为字符串44444里面共有(4,4,4,4,4,44,44,44,44,444,444,444,4444,4444,44444)15个是4的倍数;

    输入

    第一行是数字T(T<1000)

    每一行一个独有的计数方式  长度小于100

    输出

    输出字符串中有多少个是4的倍数  占一行

    样例输入

    复制
    4
    5--4
    1--1,1--2
    2--4,2--2,2--3
    1--4,1--3,1--2,1--1

    样例输出

    复制
    15
    1
    3
    3

    打表查一下4的倍数的数字会发现规律,对于个位数,只有4/8是4的倍数,对于多位数,如果个位是奇数那他不可能是4的倍数,
    如果
    个位数是0/4/8,那十位数只有是偶数,这个数才是4的倍数;如果个位数是2/6那么十位数只有是奇数这个数才是4的倍数。
    知道规律就简单了,记录下pre表示前面几段有多少个数字,枚举一下当前段的数字,奇数不管,2/6就加上pre,4/8根据前面的
    数的奇偶性分情况讨论一下。



    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    #define LL long long 
    #define uint unsigned int
     
     
    LL a[110],b[110];
    char s[110];
    int main()
    {
        int i,j,k,t;
     
        scanf("%d",&t);
        getchar();
        while(t--){
            int tot=0;
            gets(s);
            LL ans=0,pre=0;
            
            LL n=strlen(s),tmp=0;
            s[n]=',';
            for(i=0;i<=n;++i){
                if(isdigit(s[i])){
                    tmp=tmp*10+(s[i]-'0');
                }
                else if(s[i]=='-'){
                    i++;
                    tot++;
                    a[tot]=tmp;
                    tmp=0;
                }
                else if(s[i]==','){
                    b[tot]=tmp;
                    tmp=0;
                }
            }
            for(i=1;i<=tot;++i){
                
                
                if(b[i]==2||b[i]==6){
                    if(b[i-1]%2==1){
                        ans+=pre;
                    }
                }
                else if(b[i]==4||b[i]==8){
                    if(b[i-1]%2==0){
                        ans+=a[i]*(pre+pre+a[i]+1)/2;
                    }
                    else{
                        ans+=a[i]*(pre+pre+a[i]+1)/2;
                        ans=ans-pre;
                    }
                }
                pre+=a[i];
            }
            cout<<ans<<endl;
        }
        return 0;
    }
  • 相关阅读:
    mysql基础
    协程
    锁与队列
    线程练习
    线程
    并发编程
    进程
    操作系统发展史
    第六周----例行报告
    附加题找bug
  • 原文地址:https://www.cnblogs.com/yi-ye-zhi-qiu/p/9065278.html
Copyright © 2020-2023  润新知