PAT_甲级_1085 Perfect Sequence (25point(s)) (C++)【双指针法】
原创
©著作权归作者所有:来自51CTO博客作者再见萤火虫IT的原创作品,请联系作者获取转载授权,否则将追究法律责任
目录
1,题目描述
题目大意
输入
2,思路
双指针法:
3,AC代码
4,解题过程
第一搏
第二搏
第三搏
第四搏
第五搏
1,题目描述
Sample Input:
Sample Output:
题目大意
从给定的一个序列中,找出一个序列,此序列的最大值M与最小值m满足:M≤m*p;
输入
- N p
- N个数
2,思路
双指针法:
- 用两个指针i,j分别指向目标序列(总序列已排序)的两端;
- 当 M ≤ m * p (即data[j] <= data[i] * p ||data[i] * p < 0),后者为溢出,当然更大)时,j向右移(M还有增长的空间),否则i向右移(M够大了,需要增大m来满足要求);
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;
}
第二搏
抛去超时先不说(早知如此),注意到 将乘法转换为除法(原先注释部分)可能会失真,于是改用乘法
测试点5:小老弟你怎么回事?
第三搏
突然想起原先做的那题PAT_甲级_1010 Radix (25分) (C++)【详细讲解】中,A*B>C有两种情况:A*B>C || A*B<0,于是:
不出我所料
多做题还是有好处的(●'◡'●)
第四搏
对程序进行剪枝,如下:
但并不能解决问题
第五搏
我又想起了在LeetCode上曾经做过的一道题,用双指针法,于是重新更换内核:
Knowledge is POWER!