タイトル説明:
エヴァは宇宙全体からコインを集めるのが好きです。
ある日、彼女は宇宙のショッピングモールに買い物に行き、チェックアウト時にさまざまなコインを使って支払うことができました。
ただし、特別な支払い要件があります。各請求書に対して、彼女は消費額を正確に支払うために正確に2枚のコインしか使用できません。
彼女が持っているすべてのコインの金種を考えると、彼女が与えられた金額を支払うために2つのコインを見つけることができるかどうかを彼女が判断するのを手伝ってください。
入力フォーマット
最初の行には、コインの数と支払われる金額をそれぞれ表す2つの整数NNとMMが含まれています。
2行目には、各コインの金種を表すNN整数が含まれています。
出力フォーマット
V1≤V2V1≤V2およびV1 + V2 = MV1 + V2 = Mとなるように、選択した2つのコインの金種を表す2つの整数V1、V2、V1、およびV2を含む1行を出力します。
答えが一意でない場合は、V1V1が最小の解が出力されます。
解決策がない場合は、を出力します No Solution
。
データ範囲
1≤N≤1051≤N≤105、
1≤M≤10001≤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
#include <iostream>
#include <cstdio>
using namespace std;
const int MAX = 100009;
int a[MAX];
int exist[1009];
int n, m;
int main()
{
scanf("%d%d", &n, &m);
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
exist[a[i]] ++;
}
int x = -1, y = 1009;
for(int i = 0; i < n; i++)
{
if(a[i] <= m)
{
if(exist[m - a[i]])
{
if(a[i] != m - a[i] || (a[i] == m - a[i] && exist[a[i]] > 1))
{
x = min(a[i], m - a[i]);
y = min(x, y);
}
}
}
}
if(x == -1)
printf("No Solution\n");
else
printf("%d %d\n", y, m - y);
return 0;
}