zoukankan      html  css  js  c++  java
  • 水题 等差数列HDU 5400 Arithmetic Sequence

    主要是要知道它对于等差数列的定义,单个数也可以作为等差数列且一定满足题意,另外就是要算清楚区间与区间的关系,考虑两大类情况,一种是d1区间和d2区间连在一起,另外一种情况就是其余情况。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #define MAXN 100005
     5 long long num[MAXN];
     6 bool tag[MAXN];
     7 using namespace std;
     8 long long getNum(long long x){
     9     return (x)*(x+1)/2;
    10 }
    11 int main(){
    12     long long n,d1,d2,i,j,k,left,right,l_sum,r_sum,sum;
    13     bool isRL = false;
    14     while(scanf("%lld%lld%lld",&n,&d1,&d2)!=EOF){
    15         for(i = 0;i < n ;i++){
    16             scanf("%lld",&num[i]);
    17         }
    18         for(i = 0;i < n-1 ; i++){
    19             num[i] = num[i+1] - num[i];
    20         }
    21         memset(tag,false,sizeof(tag));
    22         l_sum = 0;
    23         r_sum = 0;
    24         sum = 0;
    25         for(i = 0;i < n-1 ; i++)//d1区间与d2区间连在一起
    26         {
    27             if(tag[i] == true)
    28                 continue;
    29             if(num[i]==d1 && num[i+1]==d2){
    30                 tag[i] = true;
    31                 tag[i+1] = true;
    32                 l_sum = 1;
    33                 r_sum = 1;
    34                 for(j = i-1 ; j>=0 ; j--){
    35                     if(num[j] == d1){
    36                         l_sum ++;
    37                         tag[j]= true;
    38                     }
    39                     else
    40                         break;
    41                 }
    42                 for(j = i+2 ; j< n-1 ; j++){
    43                     if(num[j] == d2){
    44                         r_sum ++;
    45                         tag[j]= true;
    46                     }
    47                     else
    48                         break;
    49                 }
    50                 sum = sum + l_sum*r_sum +getNum(l_sum) + getNum(r_sum);
    51             }
    52         }
    53         k =0 ;
    54         for(i = 0;i < n-1;i++){//其余情况
    55             if(tag[i]==true)
    56                 continue;
    57             if(num[i]==d1){
    58                 k = 1;
    59                 for(j = i+1 ; j<n-1;j++){
    60                     if(num[j]==d1){
    61                         k++;
    62                         i = j;
    63                         tag[j] = true;
    64                     }
    65                     else {
    66                         i = j-1;
    67                         break;
    68                     }
    69                 }
    70                 sum = sum+getNum(k);
    71             }
    72             else if(num[i]==d2){
    73                 k = 1;
    74                 for(j = i+1 ; j<n-1;j++){
    75                     if(num[j]==d2){
    76                         k++;
    77                         i = j;
    78                         tag[j] = true;
    79                     }
    80                     else {
    81                         i = j-1;
    82                         break;
    83                     }
    84                 }
    85                 sum = sum+getNum(k);
    86             }
    87             else
    88             {
    89                 continue;
    90             }
    91         }
    92         sum+=n;
    93         printf("%lld
    ",sum);
    94     }
    95     return 0;
    96 }
  • 相关阅读:
    菜单范式
    PIC18F26K20
    单片机中串口通信模型
    STM8S103之GPIO
    STM8S103之ADC
    二叉树最近公共祖先
    全排列
    整数翻转
    完全二叉树节点个数
    二叉树的深度
  • 原文地址:https://www.cnblogs.com/fancy-itlife/p/4750526.html
Copyright © 2011-2022 走看看