1、测试点3:处理n=1的情况,第一个代码单独处理了,第二个代码不用。如果只有一个数,这里应该是默认最大值最小值能相同,所以n=1输出1
2、测试点4:运行时长有限制——>对循环做一些小小的控制:
1)不符合直接退出;
2)符合的话因为min*p我们遍历min是从小到大的,所以是递增的,那么曾经符合max<=min*p的max现在肯定符合,就无需再次比较。
3、测试点5:两个9位的int数相乘,是很有可能达到19位的long long的啦.
真服了搞半天是那个int x=a[i]*p没改过来;
以下这个通过不了测试点4
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N=100010;
typedef long long ll;
ll a[N];//两个10^9的数相乘,当然有可能超过long啦,long long 是19位啦
int main()
{
int n;
ll p;
cin>>n>>p;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n);
if(n==1)
{
cout<<1;
return 0;
}
int ans=0;
for(int i=0;i<n-1;i++)
{
ll x=a[i]*p;
int j=ans;
while(a[j]<=x&&j<n)
{
j++;
}
int k=j-i;
if(k>=ans)
{
ans=k;
}
}
cout<<ans;
return 0;
}
测试样例:
// 10 8
//2 3 20 4 5 1 6 7 8 9
//
// p=8 max<=min*p
// 1 2 3 4 5 6 7 8 9 20
// 1*p=8>=2 3 4 5 6 7 8
// 2*p=18>=2 3 4 5 6 7 8 9
// 3*p=24>=2....9 20输出:8
修改后:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int N=100010;
typedef long long ll;
ll a[N];//两个10^9的数相乘,当然有可能超过long啦,long long 是19位啦
int main()
{
int n;
ll p;
cin>>n>>p;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n);
int ans=0;
for(int i=0;i<n;i++)
{
ll x=a[i]*p;
for(int j=i+ans;j<n;j++)
{
if(a[j]<=x)
{
int k=j-i+1;
if(k>ans)
{
ans=k;
}
}
else{
break;
}
}
}
cout<<ans;
return 0;
}