(模拟)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 )-arithmetic sequence.
Input
There are multiple test cases.
For each test case, the first line contains three numbers ).
For each test case, the first line contains three numbers ).
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 ", 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 ", sum+n); ///n是只有一个元素的时候 } return 0; }