1048. Find Coins (25)

題目鏈接:https://www.patest.cn/contests/pat-a-practise/1048


題目大意:給出一個數列和一個值m,找出數列中的兩個數v1,v2使得v1+v2=m。並且v1<=v2,若不唯一,輸出v1最小的那個


解題思路:

  • 先將數列排序
  • 定義i,j,從數列的左側和右側開始掃描,並計算臨時和
  • 和較大j前移,和較小i後移,知道找到合適的i,j

代碼如下:

#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int main(int argc, char const *argv[])
{
    int n,m;
    cin>>n>>m;
    int buf[n];
    for(int i=0;i<n;i++)
        scanf("%d",&buf[i]);
    //先升序排序
    sort(buf,buf+n);
    int i=0,j=n-1,tmp;
    while(i<j){
        //臨時和
        tmp=buf[i]+buf[j];
        if(tmp<m)//臨時和較小
            i++;//左邊指針右移
        else if(tmp>m)//臨時和較大
            j--;//右邊指針左移
        else{
            cout<<buf[i]<<" "<<buf[j]<<endl;
            return 0;
        }
    }
    cout<<"No Solution"<<endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章