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){}