問題 D: QAQ & ORZ 的簽到題
時間限制: 1 Sec 內存限制: 128 MB提交: 834 解決: 204
題目描述
QAQ 的好朋友 ORZ,最近在做一個選拔節目的評委,對於每位選手 ORZ 想知道在這個選手以及這位選手前面的的選手中,得分最高和最低的選手的序號分別是多少....
ORZ 找了 QAQ 幫忙,但是 QAQ 最近在追火星情報局....所以你可以幫助 QAQ 解決 ORZ 的問題嗎?
輸入
第一行一個數 T
($1
\leq T \leq 10$),表示 T
組測試數據
第二行一個數 n
($1
\leq n \leq 10^5$ ),表示有 n
位選手
接下來 n
行,每行一個數 a
($1
\leq a \leq 10^8$),表示第 i
位選手的得分,打分總是從第一位選手開始
輸出
輸出從 1 ~ n
位選手中 a[i]
,在 1
~ i
之間的選手中得分最高和得分最低的選手的序號分別是多少。
如果得分相同則優先輸出較小的序號。
樣例輸入
1
3
1
2
3
樣例輸出
1 1
2 1
3 1
// 坑在如果相等的情況下輸出最小的。
// 題意分析: i = 1 時 輸出 1 1;
i = 2 時 分三種情況:
1 ) 如果 a[i] > a[i-1] : max = a[i] , pos1 = i ; min = a [i-1] , pos2 = i - 1;
2 ) 如果 a[i] < a[i-1] : max = a[i-1] , pos1 = i -1 ; min = a [i] , pos2 = i ;
3 ) 如果 a[i] == a[i-1] : max = min = a[i] , pos1 = pos2 = i;
i > 2 時 就與最大最小值比較
1 ) 即不大於最大值也不小於最大值就不更新最大最小值的位置,相等也不更新;
2 ) 大於最大值就更新最大值的位置;
3 ) 小於最小值就更新最小值的位置;
//代碼如下:
#include <cstdio>
const int maxn = 1e6 + 10;
int a[maxn];
int main()
{
int t;
scanf ("%d",&t);
while (t--)
{
int n,l,r;
int max,min;
scanf ("%d",&n);
for (int i = 1 ; i <= n ; i++)
{
scanf ("%d",&a[i]);
if (i == 1)
printf ("%d %d\n",i,i);
else if (i == 2)
{
if (a[i] < a[i-1])
{
max = a[i-1];
l = i-1;
min = a[i];
r = i;
}
else if (a[i] > a[i-1])
{
max = a[i];
l = i;
min = a[i-1];
r = i-1;
}
else
l = r = i-1;
printf ("%d %d\n",l,r);
}
else
{
if (a[i] <= max && a[i] >= min)
printf ("%d %d\n",l,r);
else if (a[i] > max)
{
max = a[i];
l = i;
printf ("%d %d\n",l,r);
}
else if (a[i] < min)
{
min = a[i];
r = i;
printf ("%d %d\n",l,r);
}
}
}
}
return 0;
}