1030. 完美数列(25)-PAT乙级

来源:互联网 发布:java培训4个月靠谱吗 编辑:程序博客网 时间:2024/05/18 02:13

题目:

给定一个正整数数列,和正整数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

解答:

//#include<iostream>//#include<algorithm>//using namespace std;////int main()//{//  int N;//  long long int p;//  cin >> N >> p;//  //if (N == 0) {//  //  cout << 0;//  //  return 0;//  //}// 这个加不加答案都一样//  long long int *n = new long long int[N];//第一次提交有一个答案错误//  for (int i = 0; i < N; i++)//  {//      cin >> n[i];//      //scanf("%d", &n[i]);//  }//  sort(n,n+N);//排序,默认升序//  long long int min=0, max=N-1;//  for (int i = 0; i < N/2+1; i++)//  {//      if (n[max] <= n[min] * p)//当看到一个比较大的数乘比较大的数时,用string不方便,就要想到long long int,具体追溯到n数组元素的值//      {//          cout << max + 1 - min;//          //printf("%d", max + 1 - min);//          break;//      }//      else if(n[max-1] <= n[min] * p)//      {//          cout << max - min;//          //printf("%d", max - min);//          break;//      }//      else if (n[max] <= n[min+1] * p)//      {//          cout << max - min;//          //printf("%d", max - min);//          break;//      }//      else//      {//          max--;//          min++;//      }//  }//    return 0;//}//很奇妙上面这个方法只有最后一个检查点错了#include<vector>#include<iostream>#include<algorithm>using namespace std;int main(){    int N;    long long int p;    cin >> N >> p;    if (N == 0) {        cout << N;        return 0;//灵活运用return 0;及时结束进程    }    vector<long long int> n(N);    for (int i = 0; i < N; i++)    {        cin >> n[i];    }    sort(n.begin(), n.end());    int result = 1;    for (int i = 0; i <= N - 2; i++) {        for (int j = i + result; j <= N - 1; j++) {            if (n[j] > n[i] * p) break;            result = max(result, j - i + 1);//巧妙运用max函数(#include<algorithm>)        }    }    cout << result;    return 0;}
0 0
原创粉丝点击