题目 A1048 Find Coins
-
题意
输入n
个数字和一个数字m
,给出v1+v2=m,v1<=v2
,输出最小的v1
和其对应的v2
或者输出No Solution
。 -
思路
很明显要使用二分搜索需要将序列进行排序,然后因为v1<=v2
所以循环限制条件里面应该有<=m/2
,并且不会再搜自己,所以开始的序号为i+1
,因为输出最小的v1
,所以找到就可以输出,最后要是没有找到即输出No Solution
即可。 -
Code in C++
#include <cstdio>
#include <algorithm>
#define maxn 100001
int coins[maxn] = {0};
int found(int left, int right, int key)
{
while(left <= right)
{
int mid = left + (right - left)/2;
if (coins[mid] == key)
{
return mid;
}
else if (coins[mid] > key)
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
return -1;
}
int main()
{
int n, m;
scanf("%d %d", &n, &m);
for (int i = 0; i < n; ++i)
{
scanf("%d",&coins[i]);
}
std::sort(coins, coins + n);
int j = -1;
for (int i = 0; i < n && coins[i] <= m/2; ++i)
{
j =found(i+1, n-1, m-coins[i]);
if (j != -1)
{
printf("%d %d", coins[i], coins[j]);
break;
}
}
if (j == -1)
printf("No Solution");
return 0;
}
小结
今天就是传统的二分算法的应用,就是需要注意条件left<=right
即可。