PAT完美数列

在这道题中,出现了三个问题:
测试点 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,因为这个都不符合,后面的就更不符合了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值