标签:
Time Limit: 12000MS | Memory Limit: 65536K | |
Total Submissions: 49919 | Accepted: 14391 | |
Case Time Limit: 5000MS |
Description
Window position | Minimum value | Maximum value |
---|---|---|
[1 3 -1] -3 5 3 6 7 | -1 | 3 |
1 [3 -1 -3] 5 3 6 7 | -3 | 3 |
1 3 [-1 -3 5] 3 6 7 | -3 | 5 |
1 3 -1 [-3 5 3] 6 7 | -3 | 5 |
1 3 -1 -3 [5 3 6] 7 | 3 | 6 |
1 3 -1 -3 5 [3 6 7] | 3 | 7 |
Your task is to determine the maximum and minimum values in the sliding window at each position.
Input
Output
Sample Input
8 3 1 3 -1 -3 5 3 6 7
Sample Output
-1 -3 -3 -3 3 3 3 3 5 5 6 7
题意:模拟滑动窗口,每k个数,输出最大值最小值
单调队列:
从这里学来的http://m.blog.csdn.net/blog/lx417147512/24916441
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <string.h> 6 using namespace std; 7 const int N = 10000000 + 10; 8 int num[N],Max[N],Min[N],Increase[N],Decrease[N]; 9 int pre1,pre2,lst1,lst2,len_max,len_min,n,k; 10 void in_Max(int i) 11 { 12 while(pre1 <= lst1 && num[i] > num[ Increase[lst1] ]) 13 lst1--; 14 Increase[++lst1] = i; 15 if(i >= k) 16 { 17 if(Increase[pre1] <= i - k) 18 pre1++; 19 Max[len_max++] = num[ Increase[pre1] ]; 20 } 21 } 22 void in_Min(int i) 23 { 24 while(pre2 <= lst2 && num[i] < num[ Decrease[lst2] ]) 25 lst2--; 26 Decrease[++lst2] = i; 27 if(i >= k) 28 { 29 if(Decrease[pre2] <= i - k) 30 pre2++; 31 Min[len_min++] = num[ Decrease[pre2] ]; 32 } 33 } 34 int main() 35 { 36 while(scanf("%d%d", &n,&k) != EOF) 37 { 38 pre1 = pre2 = len_max = len_min = 0; 39 lst1 = lst2 = -1; //注意这个要设成-1 40 for(int i = 1; i <= n; i++) 41 { 42 scanf("%d",&num[i]); 43 in_Max(i); 44 in_Min(i); 45 } 46 printf("%d",Min[0]); 47 for(int i = 1; i < len_min; i++) 48 printf(" %d",Min[i]); 49 printf("\n"); 50 printf("%d",Max[0]); 51 for(int i = 1; i < len_max; i++) 52 printf(" %d",Max[i]); 53 printf("\n"); 54 } 55 return 0; 56 }
标签:
原文地址:http://www.cnblogs.com/zhaopAC/p/5020271.html