試題 算法提高 上帝造題五分鐘
資源限制
時間限制:1.0s 內存限制:256.0MB
問題描述
第一分鐘,上帝說:要有題。於是就有了L,Y,M,C
第二分鐘,LYC說:要有向量。於是就有了長度爲n寫滿隨機整數的向量
第三分鐘,YUHCH說:要有查詢。於是就有了Q個查詢,查詢向量的一段區間內元素的最小值
第四分鐘,MZC說:要有限。於是就有了數據範圍
第五分鐘,CS說:要有做題的。說完衆神一鬨而散,留你來收拾此題
輸入格式
第一行兩個正整數n和Q,表示向量長度和查詢個數
接下來一行n個整數,依次對應向量中元素:a[0],a[1],…,a[n-1]
接下來Q行,每行兩個正整數lo,hi,表示查詢區間[lo, hi]中的最小值,即min(a[lo],a[lo+1],…,a[hi])。
輸出格式
共Q行,依次對應每個查詢的結果,即向量在對應查詢區間中的最小值。
樣例輸入
7 4
1 -1 -4 8 1 2 -7
0 0
1 3
4 5
0 6
樣例輸出
1
-4
1
7
樣例說明
第一個查詢[0,0]表示求min{a[0]}=min{1}=1
第二個查詢[1,3]表示求min{a[1],a[2],a[3]}=min{-1,-4,8}=-4
第三個查詢[4,5]表示求min{a[4],a[5]}=min{1,2}=1
第四個查詢[0,6]表示查詢整個向量,求min{a[0..6]}=min{1,-1,-4,8,1,2,-7}=-7
數據規模與約定
1<=n<=1984,1<=Q<=1988,向量中隨機整數的絕對值不超過1,000
代碼
#include<stdio.h>
int min(int x,int y){//求最小值函數
if(x>y){
return y;
}
return x;
}
int main(){
int n,q;
scanf("%d%d",&n,&q);
int a[n],i,j,b[q][2];
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<q;i++){
scanf("%d%d",&b[i][0],&b[i][1]);
}
for(i=0;i<q;i++){
if(b[i][0]==b[i][1]){//只有一個數直接輸出
printf("%d\n",a[b[i][1]]);
}
else{
int t=min(a[b[i][0]],a[b[i][0]+1]);//先初始化t的值
for(j=b[i][0]+2;j<=b[i][1];j++){
t=min(t,a[j]);//每次比較取最小
}
printf("%d\n",t);
}
}
return 0;
}