(模拟)Arithmetic Sequence -- HDU -- 5400

链接:

http://acm.hdu.edu.cn/showproblem.php?pid=5400

 

 

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 875    Accepted Submission(s): 386


Problem Description
A sequence  b1,b2,,bn are called (d1,d2)-arithmetic sequence if and only if there exist i(1in) such that for every j(1j<i),bj+1=bj+d1 and for every j(ij<n),bj+1=bj+d2.

Teacher Mai has a sequence a1,a2,,an. He wants to know how many intervals [l,r](1lrn) there are that al,al+1,,ar are (d1,d2)-arithmetic sequence.
 

 

Input
There are multiple test cases.

For each test case, the first line contains three numbers  n,d1,d2(1n105,|d1|,|d2|1000), the next line contains n integers a1,a2,,an(|ai|109).
 

 

Output
For each test case, print the answer.
 

 

Sample Input
5 2 -2     0 2 0 -2 0      5 2 3    2 3 3 3 3
 

 

Sample Output
12    5
 
 
 
 
代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>

#define N 100005
#define LL long long

int a[N], dp[N];

int main()
{
    int n, d1, d2;

    while(scanf("%d%d%d", &n, &d1, &d2)!=EOF)
    {
        int i;

        for(i=1; i<=n; i++)
            scanf("%d", &a[i]);

        memset(dp, 0, sizeof(dp));

        for(i=1; i<n; i++)
        {
            if(a[i+1]==a[i]+d1)
                dp[i+1] = 1;
            else if(a[i+1]==a[i]+d2)
                dp[i+1] = 2;
            else dp[i+1] = 3;
        }

        LL ans=0, tmp=0;

        for(i=1; i<=n; i++)
        {
            if(dp[i]==1)
            {
                if(dp[i-1]==2) tmp = 1;
                else  tmp++;

                ans = ans + tmp +1;
            }
            else if(dp[i]==2)
            {
                tmp++;
                ans = ans + tmp + 1;
            }
            else
            {
                ans ++;
                tmp = 0;
            }
        }

        printf("%lld\n", ans);

    }
    return 0;
}

 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define N 110000

int a[N];

int main()
{
    int n, i, x, y, d1, d2;

    while(scanf("%d%d%d", &n, &d1, &d2)!=EOF)
    {
        __int64 s1, s2, sum;

        s1 = s2 = sum = 0;
        memset(a, 0, sizeof(a));

        scanf("%d", &x);

        for(i=1; i<n; i++)
        {
            scanf("%d", &y);
            a[i] = y-x;
            x = y;
        }

        for(i=1; i<n; i++)
        {
            if(a[i]==d1)
            {
                if(a[i-1]!=d1)  s1 = 0;

                s1++;
                sum += s1;  ///sum加上当前公差为的d1序列长度
                s2 = 0;     ///s2进行清零
            }
            else if(a[i]==d2)
            {
                s2++;
                sum += s1 + s2;  ///加上公差为d2和前半段为d1后半段为d2的序列长度
            }
            else
                s1 = s2 = 0;
        }

        printf("%I64d\n", sum+n);  ///n是只有一个元素的时候
    }

    return 0;
}

 

转载于:https://www.cnblogs.com/YY56/p/4749697.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值