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;
}

 

转载于:https://www.cnblogs.com/yi-ye-zhi-qiu/p/9065278.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值