HDU5400 Arithmetic Sequence
解题思路:这题看懂题目是很关键的,这个区间是等差数列,且公差为d1或d2,
特别注意单个数字也为等差数列。每次求出等差数列序列长度,然后
求出对应这种长度对应有多少种组合方式,累加起来就是结果。
注意要用long long,还有注意特判数据,如 5 -1 -1 ,5 4 3 2 1;
5 1 1, 1 2 3 4 5 ; 5 1 1, 1 1 1 1 1等。
1 #include<cstdio> 2 int main() 3 { 4 int A[100005], n, d1, d2; 5 long long sum, cnt; //注意这里要用long long 否则会WA 6 //int sum, cnt; 7 while(~scanf("%d %d %d", &n, &d1, &d2)) 8 { 9 sum = cnt = 0; 10 for(int i = 0; i < n; i++) scanf("%d", &A[i]); 11 for(int i = 1; i < n; i++) 12 { 13 if(A[i]-A[i-1] == d1) 14 { 15 while(A[i]-A[i-1] == d1) 16 { 17 i ++; 18 cnt ++; 19 if(i == n) break; 20 } 21 if(i == n) break; //i为n时要及时跳出,其它地方同理。 22 while(A[i]-A[i-1] == d2) 23 { 24 i ++; 25 cnt ++; 26 if(i == n) break; 27 } 28 sum += (cnt+1)*cnt/2; //满足条件的序列长度为cnt+1时,共有(cnt+1)*cnt/2种组合方式 29 cnt = 0; //cnt重新初始化 30 i --; //一定要回退一步,画画就知道了。 31 continue; 32 } 33 if(i == n) break; 34 if(A[i]-A[i-1] == d2) 35 { 36 while(A[i]-A[i-1] == d2) 37 { 38 i ++; 39 cnt ++; 40 if(i == n) break; 41 } 42 sum += (cnt+1)*cnt/2; 43 cnt = 0; 44 i --; 45 } 46 } 47 sum += (cnt+1)*cnt/2; //这步不能少 48 printf("%I64d\n", sum+n); //一定要加上这个n,刚开始我加的是5,WA了一发 49 // printf("%d\n", sum+n); 50 } 51 return 0; 52 }