1、题目链接
2、题意分析
- (1)题意:给出一串数字个数n,以及每个具体的数array[n],同时又有一个数m,求从array[n]中找出满足array[i]+array[j]=m最小的i以及相对于的j值。
- (2) 分析:对于这种题目,我们可以使用二分法来解决。我们将这个数组进行排序(使用sort(array,array+n))。然后依次遍历,从剩余的序列中找出满足array[i]+array[j] = m的数array[j],这个寻找array[j]的过程即可以使用二分法来做。
3、源代码
#include <stdio.h>
#include <algorithm>
using namespace std;
#define size 100002
/*
1.使用二分法解决此题
*/
int main(){
int n ,money;//n是number of coins
scanf("%d %d",&n,&money);
int i;
int array[size];
for(i = 0;i<n;i++){
scanf("%d",&array[i]);//输入各个coin的价值
}
sort(array,array+n);//将其从小到大排序
if(n == 1)//测试点--->当只有一个coin的时候,直接输出No Solution
{
printf("No Solution");
return 0 ;
}
for(i = 0;i < n;i++){
int left = i+1,right = n ;//左右区间,从i+1开始
int result = money - array[i];//找这个数字是否存在 (method of bisection)
while(left <= right){
int mid = (left + right) /2;
if(array[mid] < result){
left = mid+1;
}
else if(array[mid] > result){
right = mid-1;
}
else{
printf("%d %d",array[i],array[mid]);
return 0;
}
}
}
printf("No Solution");
}
4. 测试用例
1 15
15
8 15
1 2 8 7 2 4 12 15
7 14
1 8 7 7 4 11 15
7 14
1 8 7 2 4 11 15
8 15
1 2 8 7 2 4 11 15
5.总结
- (1)需要注意这里寻找的是result = money - array[i]在后面的序列中是否存在。
- (2)需要注意 left初始值为 i+1,只有这样才能使测试数据
7 14
1 8 7 2 4 11 15
通过。
- (3)注意while循环结束的条件是while(left <= right){}