首先尝试直接模拟,最后几个案例时间超限了
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<stack>
#include<queue>
#include<cstdlib>
#include <algorithm>
#include<string.h>
#include<math.h>
#define llu unsigned long long
using namespace std;
int minf(int a[],int left,int right)
{
int min=0x3f3f3f3f3f3f;
for(int i=left;i<=right;i++)
{
if(a[i]<min)min=a[i];
}
return min;
}
int maxf(int a[],int left,int right)
{
int max=-0x3f3f3f3f3f3f;
for(int i=left;i<=right;i++)
{
if(a[i]>max)max=a[i];
}
return max;
}
int main()
{
int n,k;
cin >> n >> k ;
int a[n+5],min[n+5],max[n+5];
for(int i=1;i<=n;i++)
cin >> a[i] ;
int l=1,r=k;
while(r<=n)
{
min[l]=minf(a,l,r);
max[l]=maxf(a,l,r);
l++;
r++;
}
for(int i=1;i<l-1;i++)
cout << min[i] << " " ;
cout << min[l-1] << endl ;
for(int i=1;i<l-1;i++)
cout << max[i] << " " ;
cout << max[l-1] << endl ;
return 0;
}
优化一下,记录一下当前最大最小值是不是已经到窗口外边了,如果没有到外边,除了新进窗口的值,其他都已经比较过了,因此只需要再把最右边的值和最大最小值比较就行了
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<stack>
#include<queue>
#include<cstdlib>
#include <algorithm>
#include<string.h>
#include<math.h>
#define llu unsigned long long
using namespace std;
static int mi=0,ma=0;
int minf(int a[],int left,int right)
{
int min=0x3f3f3f3f3f3f;
if(mi>=left){
min=a[mi];
if(a[right]<min)
{
min=a[right];
mi=right;
}
}
else for(int i=left;i<=right;i++)
{
if(a[i]<min)
{
min=a[i];
mi=i;
}
}
return min;
}
int maxf(int a[],int left,int right)
{
int max=-0x3f3f3f3f3f3f;
if(ma>=left){
max=a[ma];
if(a[right]>max)
{
max=a[right];
ma=right;
}
}
else for(int i=left;i<=right;i++)
{
if(a[i]>max)
{
max=a[i];
ma=i;
}
}
return max;
}
int main()
{
int n,k;
cin >> n >> k ;
int a[n+5],min[n+5],max[n+5];
for(int i=1;i<=n;i++)
cin >> a[i] ;
int l=1,r=k;
while(r<=n)
{
min[l]=minf(a,l,r);
max[l]=maxf(a,l,r);
l++;
r++;
}
for(int i=1;i<l-1;i++)
cout << min[i] << " " ;
cout << min[l-1] << endl ;
for(int i=1;i<l-1;i++)
cout << max[i] << " " ;
cout << max[l-1] << endl ;
return 0;
}