目录

​1,题目描述​

​ 题目大意​

​输入​

​2,思路​

​双指针法:​

​3,AC代码​

​4,解题过程​

​第一搏​

​第二搏​

​第三搏​

​第四搏​

​第五搏​


1,题目描述

PAT_甲级_1085 Perfect Sequence (25point(s)) (C++)【双指针法】_PAT

Sample Input:

10 8
2 3 20 4 5 1 6 7 8 9

 

Sample Output:

8

 题目大意

从给定的一个序列中,找出一个序列,此序列的最大值M与最小值m满足:M≤m*p;

输入

  1. N    p
  2. N个数

 

2,思路

双指针法:

  1. 用两个指针i,j分别指向目标序列(总序列已排序)的两端;
  2. 当 M ≤ m * p (即data[j] <= data[i] * p ||data[i] * p < 0),后者为溢出,当然更大)时,j向右移(M还有增长的空间),否则i向右移(M够大了,需要增大m来满足要求);
  3. PAT_甲级_1085 Perfect Sequence (25point(s)) (C++)【双指针法】_C++_02

 

3,AC代码

#include<bits/stdc++.h>
using namespace std;

int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif // ONLINE_JUDGE
int N, p, data[100006];
scanf("%d %d", &N, &p);
for(int i = 0; i < N; i++)
scanf("%d", &data[i]);
sort(data, data + N);
int ans = 0, i = 0, j = 0;
while(i < N && j < N){
if(data[j] <= data[i] * p || data[i] * p < 0){
if(ans < j - i + 1)
ans = j - i + 1;
j++;
}else i++;
}
cout<<ans;
return 0;
}

 

4,解题过程

第一搏

如你所料

#include<bits/stdc++.h>
using namespace std;

int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif // ONLINE_JUDGE
int N, p, data[100006];
scanf("%d %d", &N, &p);
for(int i = 0; i < N; i++)
scanf("%d", &data[i]);
sort(data, data + N);
int ans = 0;
for(int i = 0; i <= N - 1; i++){
for(int j = i; j < N; j++){ //j需从i开始 不然会漏掉情况
if(data[j] / data[i] <= p && j - i + 1 > ans)
ans = j - i + 1;
}
}
cout<<ans;
return 0;
}

PAT_甲级_1085 Perfect Sequence (25point(s)) (C++)【双指针法】_甲级_03

第二搏

抛去超时先不说(早知如此),注意到 将乘法转换为除法(原先注释部分)可能会失真,于是改用乘法

PAT_甲级_1085 Perfect Sequence (25point(s)) (C++)【双指针法】_PAT_04

PAT_甲级_1085 Perfect Sequence (25point(s)) (C++)【双指针法】_PAT_05

测试点5:小老弟你怎么回事?

第三搏

突然想起原先做的那题​​PAT_甲级_1010 Radix (25分) (C++)【详细讲解】​​中,A*B>C有两种情况:A*B>C || A*B<0,于是:

PAT_甲级_1085 Perfect Sequence (25point(s)) (C++)【双指针法】_双指针法_06

不出我所料

PAT_甲级_1085 Perfect Sequence (25point(s)) (C++)【双指针法】_C++_07

多做题还是有好处的(●'◡'●)

第四搏

对程序进行剪枝,如下:

PAT_甲级_1085 Perfect Sequence (25point(s)) (C++)【双指针法】_双指针法_08

但并不能解决问题

PAT_甲级_1085 Perfect Sequence (25point(s)) (C++)【双指针法】_1085_09

第五搏

我又想起了在LeetCode上曾经做过的一道题,用双指针法,于是重新更换内核:

PAT_甲级_1085 Perfect Sequence (25point(s)) (C++)【双指针法】_C++_10

PAT_甲级_1085 Perfect Sequence (25point(s)) (C++)【双指针法】_1085_11

Knowledge is POWER!