题目:
输入例子1:
1
5 3
6 2 4 3 8
输出例子1:
YES
输入例子2:
1
5 2
1 8 2 3 4
输出例子2:
NO
说明:
贪心思想,每次选择小于当前高度的最大高度作为下一步,若没有小于当前高度的且还未使用超能力,则使用一次超能力,选择最大高度作为下一步。
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e5+5;
signed main(){
int t;
cin>>t;
while(t--){
int n,k;
int a[maxn];
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
bool isNeed=true; //是否需要使用超能力
int super=1;
int i=1;
for(i=1;i<=n;i++){
int kmax=0,km=i; //kmax记录最大值,km记录最大值的下标
isNeed=true;
for(int j=1;j<=k;j++){
if(i+j<=n&&a[i+j]<a[i]){
isNeed=false;
if(a[i+j]>=kmax){
kmax=a[i+j];
km=i+j-1; //减1是因为循环本身还要自增1
}
}
}
if(isNeed&&super>0){ //需要使用超能力且有超能力
super--;
//重复上面的选择方法,只不过不需要寻找比自身小的作为下一步,可以选择任意的
int kmax=0,km=i;
for(int j=1;j<=k;j++){
if(i+j<=n){
if(a[i+j]>=kmax){
kmax=a[i+j];
km=i+j-1;
}
}
}
if(kmax==0){
break; //kmax=0,说明找不到符合条件的下一步,则失败
}
i=km;
continue;
}else if(kmax==0){
break; //kmax=0,说明找不到符合条件的下一步,则失败
}
i=km;
}
if(i==n){
cout<<"YES"<<endl;
}else{
cout<<"NO"<<endl;
}
}
return 0;
}