题目大意
给 N N N个硬币,问能否从这个 N N N个硬币中只用两个凑出 M M M
输入
每组包含一个测试用例
第一行是两个正数
N
≤
1
0
5
N\leq10^5
N≤105表示硬币总数,
M
≤
1
0
3
M\leq10^3
M≤103表示要凑的数
第二行是
N
N
N个正数,表示
N
N
N个硬币的值(不超过500)
输出
对每个样例,输出能凑出
M
M
M,且两个硬币之差最大的那组,且小硬币排在大硬币之前。如果不能凑出就输出No Solution
样例输入
8 15
1 2 8 7 2 4 11 15
7 14
1 8 7 2 4 11 15
样例输出
4 11
No Solution
解析
因为题目中说了硬币值的范围,所以直接开个那么大的数组表示每种值的硬币的数量,对硬币排序后,每次查询即可。
但是这题非常坑的一点是题中说硬币的值不超过500,如果数组只开到500会有返回非0
的错误,看了其他人的解法才知道,这个硬币的值会超过500,具体是多少不知道,但是开到1000就可以AC
# -*- coding: utf-8 -*-
# @Time : 2019/6/7 17:22
# @Author : ValarMorghulis
# @File : 1048.py
def solve():
n, m = map(int, input().split())
money = [0 for i in range(1000)]
a = list(map(int, input().split()))
a = sorted(a, key=lambda x: x)
for i in range(n):
money[a[i]] += 1
flag = False
for i in range(n):
if a[i] != m - a[i]:
if money[m - a[i]]:
print("%d %d" % (min(a[i], m - a[i]), max(a[i], m - a[i])))
flag = True
break
elif money[a[i]] >= 2:
print("%d %d" % (a[i], a[i]))
flag = True
break
if not flag:
print("No Solution")
if __name__ == "__main__":
solve()