C++ 1030 完美数列(25 分)

参照:https://blog.csdn.net/qq_34594236/article/details/52132036

看完题目最容易想到的是:先将数列排列后, for i循环中嵌套一个for  j找出能选出的最大数  。

1.N的范围是(<=10^9) N^2会达到10^18,可能会超时。用ans记录当前最大能选择的个数,当进行下一次 i 判断的时候,就可以减少不必要的判断,从而达到优化的效果。

2.正整数是不超过10^9,p也是,p*num最大会达到10^18,如果int的范围是10^16那么就会超范围溢出。所以要换用long或者double都可以。

#include<iostream> 
#include<algorithm>
using namespace std;
 
int main(){
	int ans=1; 
	long n,p,temp;
	long M ,m;	
	//读取和存储数据 
	scanf("%d%d",&n,&p);
	
	int num[n];
	
	for(int i=0 ;i<n ;i++){
		scanf("%d",&num[i]);
	}
	
	sort(num,num+n);   //从小到大排序   等价于sort(num,num+n,less<int>());
	//遍历 
	for(int i=0 ;i<n ;i++){
		m = num[i];
		for(int j=i+ans ;j<n ;j++){ //优化 
			M = num[j];
			if(M<=p*m){
				if(j-i+1>ans){
					ans = j-i+1;
				}
			}
			else{
				break;
			}
		}
	}
	
	printf("%d\n",ans);
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_36122764/article/details/82289874
今日推荐