题目描述
为了检测生产流水线上总共N件产品的质量,我们首先给每一件产品打一个分数A表示其品质,然后统计前M件产品中质量最差的产品的分值Q[m] = min{A1, A2, ... Am},以及第2至第M + 1件的Q[m + 1], Q[m + 2] ... 最后统计第N - M + 1至第N件的Q[n]。根据Q再做进一步评估。
请你尽快求出Q序列。
输入输出格式
输入格式:
输入共两行。
第一行共两个数N、M,由空格隔开。含义如前述。
第二行共N个数,表示N件产品的质量。
输出格式:
输出共N - M + 1行。
第1至N - M + 1行每行一个数,第i行的数Q[i + M - 1]。含义如前述。
输入输出样例
说明
[数据范围]
30%的数据,N <= 1000
100%的数据,N <= 100000
100%的数据,M <= N, A <= 1 000 000
解题思路:
一道st表的水题,直接看代码.
AC代码:
1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<cstring> 5 6 using namespace std; 7 8 int n,m,dp[100005][25];//dp[i][j]表示区间[i,i+2^j-1]的最小值。 9 10 void stb() { 11 for(int i = 1;i <= 20; i++) 12 for(int j = 1;j <= n; j++) 13 if(j + (1 << i) - 1 <= n) 14 dp[j][i] = min(dp[j][i-1],dp[j+(1<<(i-1))][i-1]);//状态转移方程 15 } 16 17 int main() 18 { 19 memset(dp,0x7f7f7f,sizeof(dp)); 20 scanf("%d%d",&n,&m); 21 for(int i = 1;i <= n; i++) 22 scanf("%d",&dp[i][0]);//dp[i][0]=第i个物品本身的质量,因为[i,i+2^0-1]这个区间长度为1,元素只有i本身。 23 stb(); 24 for(int i = 1;i <= n - m + 1; i++) { 25 int k = log2(m); 26 printf("%d ",min(dp[i][k],dp[i+m-1-(1<<k)+1][k])); 27 } 28 return 0; 29 }