PAT甲级-1048 Find Coins

题目

题目大意

给出硬币的个数n和要付费的钱m,接下来给出每个硬币的面值。要求从这些硬币中找到两个硬币v1, v2,使得v1 + v2 == m,且v1 < v2,输出v1 v2。如果不能找到这两个硬币,输出No Solution。

思路

刚开始用的模拟,即代码中被注释掉的部分,外循环从第一个硬币开始遍历,内循环从最后一个硬币开始遍历,但是有测试点超时。所以后来又改了二分法来查找。

代码

cpp 复制代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int n, m;
vector<int> v;

int erfen(int i){
    int low = i + 1, high = n - 1;
    while (low <= high){
        int mid = (low + high) / 2;
        if (v[mid] == m - v[i]){
            return v[mid];
        }else if (v[mid] > m - v[i]){
            high = mid - 1;
        }else{
            low = mid + 1;
        }
    }
    return -1;
}

int main(){
    cin >> n >> m;
    v.resize(n);
    for (int i = 0; i < n; i++){
        cin >> v[i];
    }

    sort(v.begin(), v.end());
    for (int i = 0; i < n; i++){
        /*for (int j = n - 1; j > i; j--){
            if (v[i] + v[j] == m){
                cout << v[i] << " " << v[j] << endl;
                return 0;
            }else if (v[i] + v[j] < m){
                break;
            }
        }*/
        int res = erfen(i);
        if (res != -1){
            cout << v[i] << " " << res << endl;
            return 0;
        }
    }

    cout << "No Solution" << endl;

    return 0;
}
相关推荐
成都易yisdong10 小时前
高程异常计算器:一款集成Geoid、重力场与地磁场的专业工具
算法
王老师青少年编程10 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【反悔贪心】:种树
c++·算法·贪心·反悔贪心·csp·信奥赛·种树
南宫萧幕10 小时前
基于 PSO 的 HEV 能量管理策略:从联合仿真建模到排错实战
开发语言·python·算法·matlab·控制
c++之路10 小时前
C++ 高频易错点
java·jvm·c++
wuminyu10 小时前
专家视角看Java多态性的底层基石vtable(虚函数表)构建过程解析
java·linux·c语言·jvm·c++
charlie11451419111 小时前
现代Qt开发教程(新手篇)1.10——进程
开发语言·c++·qt·学习
生物信息与育种11 小时前
全基因组重测序及群体遗传与进化分析技术服务指南
人工智能·深度学习·算法·数据分析·r语言
AI人工智能+电脑小能手11 小时前
【大白话说Java面试题】【Java基础篇】第23题:ConcurrentHashMap的底层原理是什么
java·开发语言·算法·哈希算法·散列表·hash
葳_人生_蕤11 小时前
hot100——回溯和DFS、BFS
算法·深度优先
Eloudy11 小时前
Steane码的稳定子的生成元集计算过程
算法