Sum of Three Values(sorting and searching)
题目描述
给定一个包含n个整数的数组,找到不同位置的三个值,它们的和为s。
输入
第一行两个整数n(1≤n≤5000)和s(1≤s≤),分别表示数组的大小以及目标和。
第二行有n个整数a1,a2,...an(1≤ai≤),表示数组元素的值。
输出
输出三个整数,对应这三个元素值的位置。如果有多个解决方案,你可以输出任意一个。如果没有解决方案,输出IMPOSSIBLE。
样例输入
4 8
2 7 5 1
样例输出
1 3 4
思路分析
1.创建一个存储 pair 类型的 vector,其中 pair 的第一个元素存储数组元素的值,第二个元素存储该元素在原数组中的下标(1-based indexing)。
2.对 vector 按照元素值进行排序,这样方便后续使用双指针法。
3.遍历排序后的 vector,对于每个元素,将问题转化为在剩余元素中寻找两个数,使得它们的和等于 s 减去当前元素的值。对于每一次转化后的两数和问题,使用 fun 函数来求解。
4. fun 函数接收起始位置 st、结束位置 ed、目标和 k 以及排序后的 vector 作为参数,使用双指针法在指定区间内寻找两数和等于目标和的情况。如果找到满足条件的两个数,将 ok 标记置为 true,并输出当前元素以及找到的两个数在原数组中的下标,然后跳出循环。
5.如果在遍历完所有可能的组合后都没有找到满足条件的三个数,最后输出 "IMPOSSIBLE"。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,s,a;
bool ok=false;
void fun(int st,int ed,int k,vector<pair<int,int>>&v){int l=st,r=ed;while(l<r){if(v[l].first+v[r].first==k){ok=true;cout<<v[st-1].second<<" "<<v[l].second<<" "<<v[r].second;break;}else if(v[l].first+v[r].first<k){l++;}else{r--;}}
}
int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>n>>s;vector<pair<int,int>>v;for(int i=0;i<n;i++){cin>>a;v.push_back({a,i+1});}sort(v.begin(),v.end());for(int i=0;i<n-2;i++){fun(i+1,n-1,s-v[i].first,v);if(ok){return 0;}}cout<<"IMPOSSIBLE";return 0;
}