找硬币
题目来源:PAT甲级真题1048
时间限制:1000ms 内存限制:64mb
题目描述
伊娃喜欢从整个宇宙中收集硬币。
有一天,她去了一家宇宙购物中心购物,结账时可以使用各种硬币付款。
但是,有一个特殊的付款要求:每张帐单,她只能使用 恰好 两个硬币来 准确 的支付消费金额。
给定她拥有的所有硬币的面额,请你帮她确定对于给定的金额,她是否可以找到两个硬币来支付。
输入格式
第一行包含两个整数 N N N 和 M M M,分别表示硬币数量以及需要支付的金额。
第二行包含 N N N 个整数,表示每个硬币的面额。
输出格式
输出一行,包含两个整数 V 1 V_1 V1, V 2 V_2 V2,表示所选的两个硬币的面额,使得 V 1 ≤ V 2 V_1 ≤ V_2 V1≤V2 并且 V 1 + V 2 = M V_1 + V_2 = M V1+V2=M。
如果答案不唯一,则输出 V 1 V_1 V1 最小的解。
如果无解,则输出 No Solution
。
数据范围
1 ≤ N ≤ 1 0 5 1 ≤ N ≤ 10^5 1≤N≤105,
1 ≤ M ≤ 1000 1 ≤ M ≤ 1000 1≤M≤1000
样例输入1
8 15
1 2 8 7 2 4 11 15
样例输出1
4 11
样例输入2
7 14
1 8 7 2 4 11 15
样例输出2
No Solution
解题思路:左右指针
需要首先对给定的硬币数组进行排序。
排序后将左指针指向数组的首项,右指针指向尾项。
如果两个指针所指的硬币加起来大于了需要支付的金额,则将右指针向左移动一格。
如果两个数加起来小于支付金额,则左指针向右移。
直到他们加起来与支付金额相等,则跳出循环。
当循环结束,没有找到加起来与支付金额相等的结果,则输出 No Solution
。
先对给定的硬币数组进行排序,然后定义两个指针,分别指向最小和最大。
假设数组为a,两个指针分别为left、right,就有以下情况
{ 1. a [ l e f t ] + a [ r i g h t ] > m , 两 者 相 加 比 金 额 大 , 说 明 右 指 针 所 指 的 值 大 了 , 需 要 将 右 指 针 左 移 一 项 。 2. a [ l e f t ] + a [ r i g h t ] < m , 两 者 相 加 比 金 额 小 , 说 明 左 指 针 的 值 小 了 , 将 左 指 针 右 移 一 项 。 3. a [ l e f t ] + a [ r i g h t ] = = m , 两 者 相 加 等 于 金 额 , 则 找 到 了 所 需 值 。 \begin{cases} 1.a[left] + a[right] > m , 两者相加比金额大,说明右指针所指的值大了,需要将右指针左移一项。 \\ 2.a[left] + a[right] < m , 两者相加比金额小,说明左指针的值小了,将左指针右移一项。 \\ 3.a[left] + a[right] == m , 两者相加等于金额,则找到了所需值。 \end{cases} ⎩⎪⎨⎪⎧1.a[left]+a[right]>m,两者相加比金额大,说明右指针所指的值大了,需要将右指针左移一项。2.a[left]+a[right]<m,两者相加比金额小,说明左指针的值小了,将左指针右移一项。3.a[left]+a[right]==m,两者相加等于金额,则找到了所需值。
解题代码-Java
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int m = input.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = input.nextInt();
}
input.close();
Arrays.sort(a);
int v1 = -1, v2 = -1;
int left = 0, right = n - 1; //左右两个指针
while (left < right) {
if (a[left] + a[right] == m) {
v1 = a[left];
v2 = a[right];
break;
} else if (a[left] + a[right] > m) {
right--;
} else {
left++;
}
}
if (v1 >= 1) {
System.out.printf("%d %d\n", v1, v2);
} else {
System.out.println("No Solution");
}
}
}