1048 Find Coins——PAT甲级(双指针)

发布于:2024-09-17 ⋅ 阅读:(93) ⋅ 点赞:(0)

Eva loves to collect coins from all over the universe, including some other planets like Mars. One day she visited a universal shopping mall which could accept all kinds of coins as payments. However, there was a special requirement of the payment: for each bill, she could only use exactly two coins to pay the exact amount. Since she has as many as 105 coins with her, she definitely needs your help. You are supposed to tell her, for any given amount of money, whether or not she can find two coins to pay for it.

Input Specification:

Each input file contains one test case. For each case, the first line contains 2 positive numbers: N (≤105, the total number of coins) and M (≤103, the amount of money Eva has to pay). The second line contains N face values of the coins, which are all positive numbers no more than 500. All the numbers in a line are separated by a space.

Output Specification:

For each test case, print in one line the two face values V1​ and V2​ (separated by a space) such that V1​+V2​=M and V1​≤V2​. If such a solution is not unique, output the one with the smallest V1​. If there is no solution, output No Solution instead.

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

 solution:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define endl '\n'
int main()
{
    int n,m;
    cin>>n>>m;
    vector<int>a(n);
    for(int i=0;i<n;i++)cin>>a[i];
    sort(a.begin(),a.end());
    bool flag=false;
    int i=0;
    int j=a.size()-1;
    while(i<j)
    {
    	if(a[i]+a[j]==m)
    	{
    		cout<<a[i]<<' '<<a[j]<<endl;
    		flag=true;
    		break;
		}
		else if(a[i]+a[j]<m)
		{
			i++;
		}
		else if(a[i]+a[j]>m)
		{
			j--;
		}
	}
	if(!flag)cout<<"No Solution";
}

这里先将题目给定数组a进行一次升序排序,然后定义两个指针i,j。i指向数组最小的元素,j指向数组最大的元素,然后将这两个元素相加的值与m进行比较,如果小于则让i指向更大的元素,即i右移,反之j左移。


网站公告

今日签到

点亮在社区的每一天
去签到