思路:
- 将输入的数组从小到大进行排序
- 分为四种情况:
(1)从右到左遍历,直到满足题意【即最大值固定】
(2)从左到右遍历,直到满足题意【即最小值固定】
(3)先左后右反复遍历,直到满足题意
(4)先右后左反复遍历,直到满足题意
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int x,int y){
return x<=y;
}
int main(){
long long n,k,num[100001];
int j=0,ans=0,maxans=0;
cin>>n>>k;
for(int i=0;i<n;i++){
cin>>num[i];
}
sort(num,num+n,cmp);
//删右
while(1){
if(num[0]*k>=num[n-j-1]) break;
j++;
}
ans=n-j;
if(ans>maxans) maxans=ans;
j=0;
//删左
while(1){
if(num[j]*k>=num[n-1]) break;
j++;
}
ans=n-j;
if(ans>maxans) maxans=ans;
int l=0,r=n;
//先删左后删右
int flag=0;
while(1){
if(flag==0){
if(num[l]*k>=num[r-1]) break;
flag=1;
l++;
}else{
if(num[l]*k>=num[r-1]) break;
flag=0;
r--;
}
}
ans=r-l;
if(ans>maxans) maxans=ans;
//先删右后删左
flag=0,l=0,r=0;
while(1){
if(flag==1){
if(num[l]*k>=num[r-1]) break;
flag=0;
l++;
}else{
if(num[l]*k>=num[r-1]) break;
flag=1;
r--;
}
}
ans=r-l;
if(ans>maxans) maxans=ans;
cout<<maxans;
}