题意:给你一个n个数的数组,每次能够选取连续的长度为K的子序列,取出其中任意一个最小元素。
一共操作Q次。问取出的元素中Max-Min最小是多少?
标程:
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=2005; 4 const int inf=0x3f3f3f3f; 5 int l,top,n,k,Q,a[N],b[N],ans,q[N]; 6 vector<int> vec; 7 int solve(int x) 8 { 9 l=1;vec.clear(); 10 for (int i=1;i<=n+1;i++) 11 if (a[i]<x) 12 { 13 if (i-l>=k) 14 { 15 top=0; 16 for (int j=l;j<i;j++) q[++top]=a[j]; 17 sort(q+1,q+top+1); 18 for (int j=1;j<=i-l-k+1;j++) vec.push_back(q[j]); 19 } 20 l=i+1; 21 } 22 sort(vec.begin(),vec.end()); 23 if (Q-1>=vec.size()) return inf; 24 return vec[Q-1]-x; 25 } 26 int main() 27 { 28 scanf("%d%d%d",&n,&k,&Q); 29 for (int i=1;i<=n;i++) scanf("%d",&a[i]),b[i]=a[i]; 30 sort(b+1,b+n+1);ans=inf; 31 for (int i=1;i<=n;i++) ans=min(ans,solve(b[i])); 32 printf("%d\n",ans); 33 return 0; 34 }
题解:技巧
枚举取数的最小值x,比x小的数都不能取。分裂数组为小块。
每个小块最多贡献len-k+1个最小值,把所有的len-k+1个最小值取出来排个序。取第Q个即是最小的Max。
我居然想出来了哈!