ZJNU 1365 - Window--中级
每次都寻找长度为k的区间内的最小值显然很容易超出时间限制
所以可以把窗户看作一个数量固定的队列
每次观察入列与出列的元素对答案贡献如何,以更新答案
#include<stdio.h> int tmp[1000010],max[1000010]; int gmax(int i,int k) { int j,m=tmp[i]; for(j=i-1;j>i-k;j--) if(m<tmp[j]) m=tmp[j]; return m; } int gmin(int i,int k) { int j,m=tmp[i]; for(j=i-1;j>i-k;j--) if(m>tmp[j]) m=tmp[j]; return m; } int main() { int n,k,i,lmin,lmax; scanf("%d%d",&n,&k); for(i=0;i<k;i++) scanf("%d",&tmp[i]); lmin=gmin(k-1,k); lmax=gmax(k-1,k); printf("%d",lmin); max[0]=lmax; for(;i<n;i++) { scanf("%d",&tmp[i]); if(tmp[i-k]==lmin)//如果即将移出的数字与前一位置的答案相同,说明答案需要重新查找 lmin=gmin(i,k); else if(tmp[i]<lmin)//如果即将移入的数字比前面的答案小,更新答案为当前位置输入的答案 lmin=tmp[i]; printf(" %d",lmin); if(tmp[i-k]==lmax) lmax=gmax(i,k); else if(tmp[i]>lmax) lmax=tmp[i]; max[i+1-k]=lmax; } printf("\n%d",max[0]); for(i=1;i<n-k+1;i++) printf(" %d",max[i]); return 0; }