1048 Find Coins (25 分)
这不双指针板子题吗🎈。
const int N=1e5+10;
int a[N];
int n,m;
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n);
int l=0,r=n-1;
bool ok=false;
while(l<r)
{
if(a[l]+a[r] > m) r--;
else if(a[l] + a[r] < m) l++;
else
{
ok=true;
cout<<a[l]<<' '<<a[r]<<endl;
break;
}
}
if(!ok) puts("No Solution");
//system("pause");
return 0;
}
二分查找的做法。
- 令int型a[]数组存放读入的所有数,并在读入完毕后对数组a从小到大排序。
- 枚举a[0]、a[1]、... 、a[n-1],对每个a[i],用二分法查找数组内是否存在m-a[i],如果存在且下标不是i,则输出a[i]与m-a[i]。
- 如果枚举完毕还没有发现匹配的一对,则输出“No Solution”。
注意点
使用二分查找法找到m-a[i]时,必须判断其是否就是a[i],即下标是否相同。如果下标相同,则说明找到的其实是同一个位置的数字,应该跳过这种情况。