1030题目主要考虑到的点要多,比如m不一定是从最小的数开始的。
二次循环可以直接从least开始执行。这些都可以提高效率。而这点也是大数出错的根源。
关于效率问题,另写一片
//#include<iostream>
#include<cstdio>
//#include<vector>
#include<algorithm>
using namespace std;
//typedef vector<long long>::iterator iter;
const long MAX = 100000;
int main(){
//std::ios_base::sync_with_stdio(false);
int N, least = 0;//, num = 0
double P,temp,rank[MAX];
//cin >> N >> P;
scanf("%d", &N);
scanf("%lf", &P);
int i, j;
//vector<long long> rank;
for (int i = 0; i != N; i++){
//cin >> rank[i];
scanf("%lf", &rank[i]);
//rank.push_back(temp);
}
sort(rank, rank+N);
//double min = *(rank.begin());
for (i = 0; (i + least )< N; i++){
for ( j = i+least-1; j < N; j++){
if (rank[j] > (P*rank[i]))
break;
if (j-i+1 > least)
least = j-i+1;;
}
//num = 0;
}
//for (iter ite = rank.begin(); ((ite + least)< rank.end()); ite++){//此处不用!=是因为加了个数可能天然就大于end了,这样会出错的。
//
// for (iter ite_in = ite;(ite_in <rank.end()) && (*ite_in <= (P*(*ite))); ite_in++){//此处有求值顺序bug。若ite已经到了end 但此时后面的句子用了解引用,这是非法的!!!
//
// num++;
//
// }
// if (num > least)
// least = num;
// num = 0;
//}
//cout << least;
printf("%d", least);
return 0;
}
#include<iostream>
//#include<stdio.h>
//#include<vector>
//#include<algorithm>
//
//using namespace std;
//typedef vector<long long>::iterator iter;
//
//int main(){
// int N,least=0,num=0;
// doubleP, temp;
// //cin >> N >> P;
// scanf("%d%lld", &N,&P);
// vector<long long> rank;
// for (int i = 0; i != N; i++){
// //cin >> temp;
// scanf("%lld", temp);
// rank.push_back(temp);
// }
// sort(rank.begin(), rank.end());
// double min=*(rank.begin());
// for (iter ite = rank.begin(); ((ite +least)< rank.end()); ite++){//此处不用!=是因为加了个数可能天然就大于end了,这样会出错的。
// min = *ite;
// for (iter ite_in = ite;
// (ite_in <rank.end())&&(*ite_in <= (P*min)) ; ite_in++){//此处有求值顺序bug。若ite已经到了end 但此时后面的句子用了解引用,这是非法的!!!
// if (*ite_in <= (P*min)){
// num++;
// }
// }
// if (num > least)
// least = num;
// num = 0;
// }
//
// printf("%d",least);
// return 0;
//}
代码如下
1030. 完美数列(25)
时间限制
300 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CAO, Peng
给定一个正整数数列,和正整数p,设这个数列中的最大值是M,最小值是m,如果M <= m * p,则称这个数列是完美数列。
现在给定参数p和一些正整数,请你从中选择尽可能多的数构成一个完美数列。
输入格式:
输入第一行给出两个正整数N和p,其中N(<= 105)是输入的正整数的个数,p(<= 109)是给定的参数。第二行给出N个正整数,每个数不超过109。
输出格式:
在一行中输出最多可以选择多少个数可以用它们组成一个完美数列。
输入样例:10 8 2 3 20 4 5 1 6 7 8 9输出样例:
8