PAT甲级-1044 Shopping in Mars

news2024/9/23 9:31:55

题目

 

题目大意

一串项链上有n个钻石,输入给出每个钻石的价格。用m元买一个连续的项链子串(子串长度可为1),如果不能恰好花掉m元,就要找到最小的大于m的子串,如果有重复就输出多个,按递增顺序输出子串的前端和后端索引。

原来的思路

取连续的子串使和恰等于m,没有恰等于就找最小的大于。可以将子串依次累加,使得每个位置都是起始位置到该位置的序列和,整个数组显递增顺序,就可以用右边减左边的方式找到满足条件的子串。直接暴力for循环,这里我的数组从0开始,没有从1开始,所以又将满足条件的子串首端索引为0的情况单拎出来,很不推荐。其次还将等于m和大于m的情况拆开求解,设了个flag,如果前期有输出的话flag为1,没有输出flag为0时再考虑样例二。没有看成>=统一求解,也不推荐。所以就超时了。

原来的代码

#include <iostream>
#include <vector>
using namespace std;

int main(){
    int n, money;
    cin >> n >> money;
    vector<int> v(n);
    for (int i = 0; i < (int)v.size(); i++){
        int num;
        cin >> num;
        i == 0 ? v[i] = num : v[i] = num + v[i - 1];
    }  // 这个思路很重要

    int flag = 0;
    for (int i = 0; i < (int)v.size(); i++){
        if (v[i] == money){
            cout << "1-" << i + 1 << endl;
            flag = 1;
        }
    }  // 查找从起始位置开始符合money的子串
    int maxi = 0;
    int q, h;  // 记录前后i的位置
    for (int i = 0; i < (int)v.size(); i++){
        for (int j = i - 1; j >= 0; j--){
            if (v[i] - v[j] == money){
                cout << j + 2 << "-" << i + 1 << endl;
                flag = 1;
            }else if (v[i] - v[j] > money){
                if (maxi < v[i] - v[j]){
                    maxi = v[i] - v[j];
                    q = j + 2;
                    h = i + 1;
                }
                break;
            }
        }
    }

    if (flag == 0){
        cout << q << "-" << h << endl;
        for (int i = h; i < (int)v.size(); i++){
            for (int j = i - 1; j >= 0; j--){
                if (v[i] - v[j] == maxi){
                    cout << j + 2 << "-" << i + 1 << endl;
                }else if (v[i] - v[j] > maxi){
                    break;
                }
            }
        }
    } //测试样例2

    return 0;
}

思路

改进参考了柳神的代码。首先就是将数组容量改为n + 1,让钻石从1开始。之前我用了两个for循环,第一个遍历i,第二个遍历j,找满足v[j] - v[i] = m的值。数组是递增顺序,可以将第二个循环用二分法优化,即在给定区间找j。然后就是将等于m和大于m这两种情况合并成>=m,也即找到>=m的最小区间,定i找j,也就是找区间的最小右边界。这时就需要考虑结果的输出形式,不能边找边输出,只能用个数组存,如果有更小的边界值就清空数组重新放。

知识点

在二分查找中,如果要找某区间的最小边界,而不是具体的找某个值,while循环的条件就要设为low < high,如果要用二分查找找到某个值,条件就设为low <= high,此时循环最终范围缩小到1位。

如果要在函数中调用数组,要将该数组设成全局变量,如果设成局部变量不断引用,会占用大量堆栈空间,可能会超时。某个数的话设成局部变量还ok。

AC代码

#include <iostream>
#include <vector>
using namespace std;

int n, money;
vector<int> v;  // 不设成全局变量就会超时

void find_j(int i, int &j, int &mint){
    int high = n;
    int low = i;
    while (low < high){  // 二分查找最小满足条件的边界,所以不加=号
        int mid = (low + high) / 2;
        if (v[mid] - v[i - 1] < money){
            low = mid + 1;
        }else{
            high = mid;  // 这里保留mid,进一步缩小范围,因为mid也可能是最小索引
        }
    }
    j = high;  // high值才是最终的二分查找结果
    mint = v[j] - v[i - 1];
}  // 二分法找到满足条件的最小索引

int main(){
    cin >> n >> money;
    v.resize(n + 1);
    for (int i = 1; i <= n; i++){
        int num;
        cin >> num;
        v[i] = num + v[i - 1];
    }  // 累加使得数组呈递增

    int mini = v[n];
    vector<int> res;
    for (int i = 1; i <= n; i++){
        int j, mint;  // i在前,j在后
        find_j(i, j, mint);  // 使用二分查找找到最小满足条件的j
        if (mint <= mini && mint >= money){
            if (mint < mini){
                mini = mint;
                res.clear();
            }
            res.push_back(i);
            res.push_back(j);
        }
    }

    for (int i = 0; i < (int)res.size(); i += 2){
        cout << res[i] << "-" << res[i + 1] << endl;
    }

    return 0;
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2110953.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2.2ceph集群部署准备-软件准备上

系统的选择 操作系统的选取&#xff0c;除了要考虑ceph本身的运行&#xff0c;一般情况下还需要考虑的因素有如下几点 系统本身的稳定性 目前稳定可靠的系统主要是基于x86和arm的linux系统&#xff0c;ceph并不能安装到windows上&#xff0c;分支上&#xff0c;debian和redhat…

sponge创建的服务与dtm连接使用etcd、consul、nacos进行服务注册与发现

本文介绍sponge创建的 transfer 服务(grpc)如何与 dtm 使用服务注册与发现连接的。此示例在同一台机器上运行的服务&#xff0c;默认 IP 地址为 127.0.0.1。如果服务运行在不同的机器上&#xff0c;请在 transfer 和 dtm 的配置文件中&#xff0c;将 127.0.0.1 替换为相应的主机…

TL431精密可调并联稳压器

TL431是一种由德州仪器(TI)公司生产的可调精密并联稳压器&#xff0c;具有较广的工作电压范围&#xff08;2.5V-36V&#xff09;和优异的电流调节能力。作为一种基准电压源&#xff0c;它广泛用于电源设计、稳压电路以及精密参考电源等应用场合。 TL431的内部结构 TL431具有三…

Zotero引用参考文献常见问题及解决方法

一、显示经典版“添加引注”对话框 使用Word插入参考文献时&#xff0c;会出现引用对话框&#xff0c;默认是图1形式&#xff0c;需要搜索对应文章或者点击下拉箭头才显示保存的文献&#xff0c;很不方便。 图 1 想要默认显示文献&#xff0c;在Zotero中左上角的“编辑”→“首…

python环境中,pytorch、tensorflow、opencv 包的安装

知不足而奋进&#xff0c;望远山而前行 —— 24.9.6 tensorflow pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tensorflow-gpu1.13.1 pip install tensorflow -i https://pypi.tuna.tsinghua.edu.cn/simple pytorch pip install torch2.0.0cu118 torchvision0.15…

基于人工智能的音乐情感分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 音乐情感分类是通过对音乐音频信号进行分析&#xff0c;识别出音乐传递的情感&#xff0c;如“愉快”、“悲伤”、“愤怒”等。该技术…

SVD降维

文章目录 一、SVD降维的基本原理二、SVD降维的步骤三、SVD降维的优点四、SVD降维的应用五、代码应用六、SVD降维的局限性 一、SVD降维的基本原理 SVD是线性代数中的一种技术&#xff0c;它将一个矩阵A分解为三个矩阵的乘积&#xff1a;A UΣV^T。其中&#xff0c;U和V是正交矩…

【项目二】C++高性能服务器开发——日志系统(各种适配器)

感谢前人的总结&#xff0c;没有他们&#xff0c;我不会这么快学完&#xff65;ω&#xff65; 知识点备忘录操作记录 知识点备忘录 数据除了打印到控制台还需要打印到本地磁盘和远程日志&#xff0c;所以需要适配器来干这活 涉及多个适配器&#xff0c;打印到控制台的、打印到…

【操作系统】进程同步之Unix域套接字

域套接字是一种高级的进程间通信的方法。 Unix域套接字可以用于同一机器多个进程间通信。 下图分别是服务端和客户端怎么使用域套接字&#xff1a; 服务端&#xff1a; 客户端&#xff1a; 分别编译后可以建立连接同步通信。 提供了单机简单可靠的通信同步服务。 只能在单…

遍历有向网格链路实现

在实际的业务中&#xff0c;我们可能遇到复杂规则&#xff08;多个或与条件组合&#xff09;&#xff0c;复杂链路等类似场景问题&#xff0c;如&#xff1a;规则引擎相关业务&#xff0c;生产任务排期等。 复杂链路示意图如下&#xff1a; 复杂网路链路场景描述 有一个或多…

【Python】pip install速度太慢的多种解决方案

目录 问题描述为什么 pip 速度这么慢&#xff1f;解决方案1. 使用国内镜像源2. 配置多个镜像源3. 使用第三方工具4. 手动下载后本地安装5. 优化网络环境6. 更新 pip 版本 测试效果 问题描述 在使用 Python 进行开发时&#xff0c;我们经常需要使用 pip 来安装第三方库。然而&am…

【项目二】C++高性能服务器开发——日志系统(日志器,日志级别,日志事件)

知识点备忘录 其实也没啥 操作记录 在乌邦图上写的&#xff0c;先是模仿sylar创建了目录 进入sylar文件夹&#xff0c;有今天写的log.h头文件 其中log_test.cpp是为了测试log.h能否正常运行建的&#xff0c;只是个测试文件 log.h写了三个类&#xff0c;日志级别&#xff0…

计算机毕业设计选题推荐-果蔬生产溯源管理系统-Java/Python

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

C++笔记19•数据结构:红黑树(RBTree)•

红黑树 1.简介&#xff1a; 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路 径会比其他路径长出俩倍…

F12抓包05:Network接口测试(抓包篡改请求)

课程大纲 使用线上接口测试网站演示操作&#xff0c;浏览器F12检查工具如何进行简单的接口测试&#xff1a;抓包、复制请求、篡改数据、发送新请求。 测试地址&#xff1a;https://httpbin.org/forms/post ① 抓包&#xff1a;鼠标右键打开“检查”工具&#xff08;F12&#xf…

卷积神经网络(一)

目录 一.卷积神经网络的组成 二.卷积层 目的: 参数: 计算公式 卷积运算过程 三.padding-零填充 1.Valid and Same卷积 2.奇数维度的过滤器 四.stride步长 五.多通道卷积 1.多卷积核(多个Filter) 六.卷积总结 七.池化层(Pooling) 八.全连接层 都看到这里了,点个…

Lanenet - 实时车道线检测系统

基于深度学习的实时车道线检测&#xff0c;lanenet,tensorflow框架&#xff0c;有界面&#xff0c;可以检测图像和视频等。 项目名称&#xff1a;Lanenet - 实时车道线检测系统 项目概述 Lanenet 是一个利用深度学习技术进行实时车道线检测的系统。该系统旨在帮助驾驶员在行驶…

分享7款实现社会实践报告AI生成论文网站

在当今社会&#xff0c;AI技术的快速发展极大地改变了我们的生活方式和工作方式。特别是在学术研究和写作领域&#xff0c;AI工具的应用已经变得越来越普遍。本文将详细介绍7款实现社会实践报告AI生成的论文网站&#xff0c;并重点推荐千笔-AIPassPaper。 1. 千笔-AIPassPaper…

【Pytorch】加载数据

数据集获取&#xff1a;链接: https://pan.baidu.com/s/1jZoTmoFzaTLWh4lKBHVbEA 密码: 5suq 本文基于P5. PyTorch加载数据初认识_哔哩哔哩_bilibili dataset&#xff1a;提供一种方式去获取数据及其label值&#xff0c;解释&#xff1a;Pytorch中的dataset类——创建适应任意…

使用rsyslog转发自定义日志到指定服务器

rsyslog简介 rsyslog 是一个高度可配置的、功能强大的系统日志守护进程&#xff0c;广泛用于 UNIX 和 Linux 系统中。它是 syslog 的一个扩展版本&#xff0c;提供了许多额外的功能和改进。能够收集、过滤、存储和转发日志数据。它的灵活性和扩展性使其成为现代 Linux 系统中日…