在这道题中,出现了三个问题:
测试点 3: 考虑只有一个数据的情况(错因:我是用了两个循环,对于j,条件j>i,当只有一个数据时,显然会发生错误)
测试点 4:数据量大时,循环过多,应修改循环
测试点 5:在比较M≤mp时,知p,元素均<=10的九次,故mp的值极有可能会超过int型,故要用 long 来存
见代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int N,p;
cin >> N >> p;
int arr[N]; //必须在接受N的值后才可按其长度开辟数组
for(int i=0;i<N;i++)
{
cin >> arr[i];
}
sort(arr,arr+N); //从小到大排
int num=0; //准备直接比较次数 进行
for(int i=0;i<N;i++)
{
for(int j=i+num;j<N;j++)
{
long m=arr[i];
if(m*p>=arr[j])
{
if((j-i+1)>num)
{
num=j-i+1;
}
}
else{
break; //相同的长度,如果现在这个不行,后面一定也不可以
}
}
}
cout << num <<endl;
return 0;
}
看了柳神的代码,在循环那里,目前最大长度为num,那么下一个数直接从距他num的数开始,如果这个数不符合,就直接break,因为这个都不符合,后面的就更不符合了。