南陽OJ-847 S + T(尋找區間最大差值及其下標)

S + T

時間限制:1000 ms  |  內存限制:65535 KB
難度:2
 
描述

   給你一個長度爲n的整數序列A1,A2,……,An,找出兩個整數Ai和Aj(i<j),使得Ai-Aj儘可能大。數組

 
輸入
輸入第一行爲數據組數T(T<=100)。每組數據的第一行爲整數的個數n(2<=n<=100000);一下n行,每行爲一個絕對值不超過150000的正整數。(全部的數據都不超過2^64 - 1)
輸出
對於每組數據,輸出Ai –Aj的最大值、i值和j值。(若是有多個最大值,則輸出先出現的最大值和i,j值)
樣例輸入
2

3
5 2 1

6
2 3 6 2 1 -1
樣例輸出
4 1 3
7 3 6
此題用窮舉法時間代價爲O(n^2),會超過期間限制。因此要用下面這種方法。
#include<stdio.h>
int main() {
  int T;
  scanf("%d", &T);
  while (T--) {
    int n, m, s = -200000;
    scanf("%d", &n);
    scanf("%d", &m);
    int max = m, index = 0, left, right; //index用於記錄數組最大值
    for (int i = 1; i < n; i++){  //left,right分別記錄下標
      scanf("%d", &m);
      if (max-m > s) {
        s = max-m;
        left = index;
        right = i;
      }
      if (m > max) {//在尋找最大差值的同時,尋找最大值。
        index = i;
        max = m;
      }
    }
    printf("%d %d %d\n", s, left+1, right+1);
  }
} 
相關文章
相關標籤/搜索