Sample Input 1:
8 15
1 2 8 7 2 4 11 15
结尾无空行
Sample Output 1:
4 11
结尾无空行
Sample Input 2:
7 14
1 8 7 2 4 11 15
结尾无空行
Sample Output 2:
No Solution
结尾无空行
题目大意:n是硬币个数,m是需要付的钱,需要找到刚刚好能付钱的两枚硬币
这一题对时间要求很高,若是在循环中使用“打擂”的方法找着两枚硬币,会超时。。。关键还是一头一尾的双指针
用双指针找的时候,若面值小了,i++,面值大了j–,找到了就停,输出这两个i,j,以后对时间要求高的题目,尽可能直接输出,不然大概率会超时
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int coin[100010];
int n, m;
int v1 = -1, v2 = -1;
int i, j;
cin >> n >> m;
for (int i = 0; i < n; i++)
cin >> coin[i];
//先排序方便搜索
sort(coin, coin + n, less<int>());
i = 0, j = n-1;
while (i<j)
{
if (coin[i] + coin[j] == m)
break;
else if (coin[i] + coin[j] < m)
i++;
else
j--;
}
if (i>=j)
cout << "No Solution";
else
cout << coin[i] << " " << coin[j] << endl;
return 0;
}