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;
}
相关推荐
小老鼠不吃猫1 分钟前
Qt C++稳定职业规划
开发语言·c++·qt
努力学算法的蒟蒻4 分钟前
day95(2.24)——leetcode面试经典150
算法·leetcode·面试
ZPC82107 分钟前
window 下使用docker
人工智能·python·算法·机器人
DaisyMosuki9 分钟前
个人实现大数加减乘(高精度加减乘)
算法·高精度·大数
郭逍遥12 分钟前
[Godot] 通过AABB包围盒和射线法检测碰撞
算法·游戏引擎·godot
大黄说说13 分钟前
解锁 .NET 性能极限:深入解析 Span 与零拷贝内存艺术
java·数据结构·算法
知识即是力量ol15 分钟前
深入理解 Snowflake 雪花算法:原理、本质、趋势递增问题与分布式顺序困境全解析
java·分布式·算法·雪花算法·snowflake·全局唯一id·分布式id生成器
啊阿狸不会拉杆16 分钟前
《计算机视觉:模型、学习和推理》第 11 章-链式模型和树模型
人工智能·学习·算法·机器学习·计算机视觉·hmm·链式模型
㓗冽17 分钟前
纯粹合数(字符串)-基础题100th + 找出质数(字符串)-基础题101th + 翻译字符串(字符串)-基础题102th
数据结构·c++
二年级程序员25 分钟前
一篇文章掌握“树”(上)
c语言·数据结构·算法