SDUT OJ 1704 数字统计问题

SDUT OJ 1704 数字统计问题


博客原文地址:http://blog.youkuaiyun.com/xuechelingxiao/article/details/40930259


昨天晚上学弟问了OJ上这个题,群里说不清楚,就写个解题报告吧。


题目大意:

中文题目,就不翻译了-。-


解题思路:

不知道算不算一个典型的数位DP,反正有点那个意思,感觉确实也可以用记忆话搜索,两个差不多的意思。


我找了一下,这个问题好像是算法设计与实验题解上面的一道题,别的OJ上没有,所以就在自己OJ上做了。

大体的思路就是,对于一个数字,比如1342,想要求出每一个数字出自出现的次数,

对于一个n位的十进制数,从一个n位十进制数的由低到高的第i个数位上,总是连续出现10^i个0,然后是10^i个1……一直到10^i个9,9之后又是连续的10^i个0,这样循环出现。找到这个规律,就可以在常数时间内算出第i个数位上每个数字出现的次数。而在第i个数位上,最后再把前导0的数量去掉就是最后要的答案了。

这样最大的时间复杂度是数字位数,也就是log10(n)的复杂度,所以就不会超时了,最后跑了0ms。


吐槽一下宿舍的网,实在是太卡了,写个博客都这么费劲。。。。。真蛋疼。。。


具体的可以看代码,代码中会有部分解释:

#include <stdio.h>
#include <string.h>

int a[10], ans[10], len;
char s[10];

int main()
{
    a[0] = 1;
    for(int i = 1; i < 10; ++i) {
        a[i] = a[i-1]*10; ///a[i]记录 pow(10, i)
    }
    int n = 0;
    scanf("%s", s);///以字符串输入 便于统计长度
    len = strlen(s);
    for(int i = 0; i < len; ++i) {
        n = n*10+(s[i]-'0'); ///计算 n
    }
//    printf("%d\n", n);
    memset(ans, 0, sizeof(ans));
    for(int i = 0; i < len; ++i) {
        int num = s[i]-'0';
        int tmp = n/a[len-i-1];
        ans[num] += n+1-tmp*a[len-i-1];///从左到右 到第i+1位数字不变的前提下,第i+1位为num的数量
        tmp /= 10;
        int j = 0;
        while(j < num) {
            ans[j++] += (tmp+1)*a[len-i-1];
            ///记录当前位置 j 出现的次数
        }
        while(j < 10) {
            ans[j++] += tmp*a[len-i-1];
            ///记录当前位置 j 出现的次数
        }
        ans[0] -= a[len-i-1]; ///去掉前导零的数目
//        printf("%d\n", ans[0]);
    }
    for(int i = 0; i < 10; ++i) {
        printf("%d\n", ans[i]); ///打印结果
    }

    return 0;
}


<think>嗯,用户想在阿里云平台上训练YOLO模型,我得先理清楚步骤。首先,用户可能对阿里云的服务不太熟悉,所以需要介绍创建实例的流程。根据引用[2],阿里云的PAI平台有交互式建模(DSW),这里可能需要指导用户如何新建实例,选择适合的镜像。CUDA版本是关键,比如YOLOv8可能需要CUDA 11.x,所以镜像的选择要对应。 然后,环境配置方面,用户需要安装Python、PyTorch、Ultralytics库等。用户可能不太清楚如何在新实例中安装这些依赖,要给出具体的pip命令。同时,数据准备部分,用户的数据可能存放在本地或者OSS,需要指导他们如何上传和组织目录结构,比如数据集目录的结构和yaml文件的配置。 训练阶段,用户可能需要示例代码,特别是如何调用YOLO的训练接口。这里需要提供一个简单的脚本,并说明参数调整的注意事项,比如批次大小和epoch数。另外,用户可能会遇到显存不足的问题,可能需要提示他们如何调整批次大小或者使用分布式训练。 模型验证和部署部分,用户训练完成后需要测试模型性能,可能需要加载最佳权重进行推理。部署方面,用户可能关心如何导出模型到ONNX格式,以及如何部署到生产环境,比如使用Flask创建API服务。 最后,优化建议也很重要,比如数据增强、超参数调优和混合精度训练,这些都能帮助用户提升模型效果。同时,用户可能会遇到环境配置错误或者路径问题,需要提醒他们检查CUDA版本和文件路径是否正确。 整体来说,步骤需要分阶段,从创建实例到环境配置、数据准备、训练、验证和部署,每个环节都要简明扼要,避免用户遗漏关键步骤。同时,结合引用中的信息,确保引用阿里云的相关操作准确,比如DSW实例的使用和镜像选择。还要考虑用户可能遇到的问题,提前给出解决方案,比如显存不足时的调整方法。</think>### 在阿里云平台上训练YOLO模型的步骤 #### 1. **创建阿里云PAI实例** - 进入阿里云控制台,选择**人工智能平台PAI**,点击**交互式建模(DSW)**新建实例[^2]。 - 在镜像选择时,建议使用预装CUDA的深度学习镜像(例如:PyTorch 1.12 + CUDA 11.6),确保兼容YOLO框架需求。 #### 2. **配置训练环境** ```bash # 进入实例后,新建Python环境(例如conda) conda create -n yolo_env python=3.8 conda activate yolo_env # 安装YOLO依赖库(以Ultralytics YOLOv8为例) pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu116 pip install ultralytics ``` #### 3. **准备数据集** - 将标注好的数据集(COCO或YOLO格式)上传至实例的存储空间(如OSS挂载或直接上传)。 - 数据集目录结构示例: ``` /dataset ├── train │ ├── images │ └── labels └── val ├── images └── labels ``` - 创建数据集配置文件`dataset.yaml`: ```yaml train: /dataset/train/images val: /dataset/val/images nc: 80 # 类别数 names: ['class1', 'class2', ...] ``` #### 4. **启动训练** ```python from ultralytics import YOLO # 加载预训练模型 model = YOLO('yolov8n.pt') # 例如YOLOv8n # 开始训练 results = model.train( data='dataset.yaml', epochs=100, imgsz=640, batch=16, device='0' # 使用GPU ) ``` - **关键参数**: - `batch`:根据GPU显存调整(阿里云GPU实例如V100可设置`batch=32`)。 - `workers`:数据加载线程数,建议设置为CPU核心数的70%。 #### 5. **模型验证与导出** ```python # 验证模型精度 metrics = model.val() # 导出为ONNX格式(便于部署) model.export(format='onnx') ``` #### 6. **部署模型** - 将导出的模型(如`yolov8n.onnx`)部署到阿里云ECS或函数计算(FC),通过API提供服务。 - 示例部署代码(Flask): ```python from flask import Flask, request, jsonify import cv2 from ultralytics import YOLO app = Flask(__name__) model = YOLO('yolov8n.onnx') @app.route('/predict', methods=['POST']) def predict(): image = request.files['image'].read() results = model(image) return jsonify(results[0].boxes.data.tolist()) ``` ### §§ 1. **显存不足**:若训练时报错`CUDA out of memory`,需降低`batch`值或使用更小的模型(如`yolov8n`→`yolov8s`)。 2. **数据集路径**:确保`dataset.yaml`中的路径与实际存储路径一致[^1]。 3. **混合精度训练**:添加参数`amp=True`可加速训练并减少显存占用。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值