题目链接:https://codeforces.com/contest/842/problem/A
题意:给出两个升序数组和一个k,求数组元素的比值是否能等于K
思路:两个指针同时指向两个数组,根据与K的比较移动指针
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
double l, r, x, y, k;
const double epl=1e-8;
int main(){
cin>>l>>r>>x>>y>>k;
for(double i=l, j=x;i<=r&&j<=y;)
{
if(abs(i/j-k)<=epl){
puts("YES");
return 0;
}
else if(i/j>k) j++;
else if(i/j<k) i++;
}
puts("NO");
return 0;
}
题目链接:https://www.acwing.com/activity/content/problem/content/834/1/
题目:给定两个升序排序的有序数组A和B,以及一个目标值x。数组下标从0开始。请你求出满足A[i] + B[j] = x的数对(i, j)。
思路:与上面一样,用两个指针一个从前往后,一个从后往前
/*
这个题巧妙的地方在于一个串从前往后遍历,另一个串从后往前遍历
*/
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+5;
int a[N], b[N];
int main(){
int n,m,x;
cin>>n>>m>>x;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<m;i++) cin>>b[i];
for(int i=0, j=m-1;i<n;i++){
int val=x-a[i];
while(b[j]>val&&j>0) j--;
if(val==b[j]) cout<<i<<" "<<j;
}
return 0;
}
扩展:
- 若要求积为k,则采用两个指针,一个从前往后一个从后往前
- 若要求差,采用两个指针,都从前往后遍历