您的位置:首页 > 其它

pat1030完美数列bug总结,

2016-01-22 21:58 295 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: