pat1030完美数列bug总结,

来源:互联网 发布:淘宝炸鱼鱼雷在哪卖 编辑:程序博客网 时间:2024/06/06 12:50

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 = 0double 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 82 3 20 4 5 1 6 7 8 9
输出样例:
8

0 0