【UP】锤子剪刀布(优化 AC)

【信息科学与工程学】【物理/化学和工程技术】第一百五十四篇 结构力学基础知识01 ​结构FEM(Abaqus)输出的应力场要传给寿命预测工具(nCode),但节点编号、单元类型、坐标系定义不一致;热仿真(Fluent)输出的温度场要传给结构FEM,但网格密度不同需要插值,插值误差可达5–10%。每次数据传递都是一次出错的机会使用统一平台(如Ansys Workbench)、开发内部数据转换脚本、手动检查和修正数据传递误差累积:每个ε约为2–5%,累积后可达5–10%。 阅读详情

记录 【PAT乙级】题解-1018 锤子剪刀布 冗余逻辑精简过程。

AC - 最高奥义

#include <iostream>
using namespace std;

int main() {

    int n;
    cin >> n;
    
    // 胜平负记录一个甲的,乙的直接逆序输出即可
    int s = 0, p = 0, f = 0;
    int ac = 0, aj = 0, ab = 0;
    int bc = 0, bj = 0, bb = 0;
    while(n --) {  C J B
        char a, b;
        cin >> a >> b;

        if(a == 'C') {
            if(b == 'C') {
                p ++;
            } else if(b == 'J') {
                s ++;
                ac ++;
            } else if(b == 'B') {
                f ++;
                bb ++;
            }
        } else if(a == 'J') {
            if(b == 'C') {
                f ++;
                bc ++;
            } else if(b == 'J') {
                p ++;
            } else if(b == 'B') {
                s ++;
                aj ++;
            }
        } else if(a == 'B') {
            if(b == 'C') {
                s ++;
                ab ++;
            } else if(b == 'J') {
                f ++;
                bj ++;
            } else if(b == 'B') {
                p ++;
            }
        }
    }

    cout << s << " " << p << " " << f << endl;
    cout << f << " " << p << " " << s << endl;

    // ab  ac  aj
    if(ab == ac && ab == aj) cout << "B ";
    else if(ac == aj && ac > ab) cout << "C ";
    else if(ab == aj && ac > ab) cout << "C ";
    else if(ab == aj && ab > ac) cout << "B ";
    else {
        if(ab > ac && ab > aj) cout << "B ";
        if(ac > ab && ac > aj) cout << "C "; 
        if(aj > ab && aj > ac) cout << "J ";
    }
    
    // bb  bc  bj
    if(bb == bc && bb == bj) cout << "B" << endl;
    else if(bc == bj && bc > bb) cout << "C" << endl;
    else if(bb == bj && bc > bb) cout << "C" << endl;
    else if(bb == bj && bb > bc) cout << "B" << endl;
    else {
        if(bb > bc && bb > bj) cout << "B" << endl;
        if(bc > bb && bc > bj) cout << "C" << endl;
        if(bj > bb && bj > bc) cout << "J" << endl;
    }

	return 0;
}

冗余逻辑 1

确定甲、乙获胜次数最多的手势,如果解不唯一,则输出按字母序最小的解( B > C > J B>C>J B>C>J)。

#include <iostream>
using namespace std;

int main() {

    int n;
    cin >> n;
    
    // 胜平负记录一个甲的,乙的直接逆序输出即可
    int s = 0, p = 0, f = 0;
    int ac = 0, aj = 0, ab = 0;
    int bc = 0, bj = 0, bb = 0;
    while(n --) {
        char a, b;
        cin >> a >> b;

        if(a == 'C') {
            if(b == 'C') {
                p ++;
            } else if(b == 'J') {
                s ++;
                ac ++;
            } else if(b == 'B') {
                f ++;
                bb ++;
            }
        } else if(a == 'J') {
            if(b == 'C') {
                f ++;
                bc ++;
            } else if(b == 'J') {
                p ++;
            } else if(b == 'B') {
                s ++;
                aj ++;
            }
        } else if(a == 'B') {
            if(b == 'C') {
                s ++;
                ab ++;
            } else if(b == 'J') {
                f ++;
                bj ++;
            } else if(b == 'B') {
                p ++;
            }
        }
    }

    cout << s << " " << p << " " << f << endl;
    cout << f << " " << p << " " << s << endl;

    // ab  ac  aj
    if(ab >= aj && ab >= ac) cout << "B ";
    else if(ac >= aj && aj > ab) cout << "C ";
    else if(ac > ab && ab >= aj) cout << "C ";
    else if(aj > ab && aj > ac) cout << "J ";
    
    // bb  bc  bj
    if(bb >= bj && bb >= bc) cout << "B" << endl;
    else if(bc >= bj && bj > bb) cout << "C" << endl;
    else if(bc > bb && bb >= bj) cout << "C" << endl;
    else if(bj > bb && bj > bc) cout << "J" << endl;

	return 0;
}

冗余逻辑 2

确定甲、乙获胜次数最多的手势。如果解不唯一,则输出按字母序最小的解( B > C > J B>C>J B>C>J)。

合并优化代码逻辑:

  • 输出 B B B,因字母序中 B B B 最小,均可取等, 满足 B ≥ C a n d B ≥ J B≥C and B≥J B≥CandB≥J 即可, C 、 J C、J C、J 的顺序无关;
  • 输出 C C C,因字母序中 B B B 最小, C C C 不可取等于 B B B,满足 C > B a n d C ≥ J C>B and C≥J C>BandC≥J)即可, B 、 J B、J B、J 的顺序无关;
  • 输出 J J J,因字母序中 J J J 最大,均不可取等,满足 J > B a n d J > C J>B and J>C J>BandJ>C)即可, B 、 C B、C B、C 的顺序无关;
#include <iostream>
using namespace std;

int main() {

    int n;
    cin >> n;
    
    // 胜平负记录一个甲的,乙的直接逆序输出即可
    int s = 0, p = 0, f = 0;
    int ac = 0, aj = 0, ab = 0;
    int bc = 0, bj = 0, bb = 0;
    while(n --) {
        char a, b;
        cin >> a >> b;

        if(a == 'C') {
            if(b == 'C') {
                p ++;
            } else if(b == 'J') {
                s ++;
                ac ++;
            } else if(b == 'B') {
                f ++;
                bb ++;
            }
        } else if(a == 'J') {
            if(b == 'C') {
                f ++;
                bc ++;
            } else if(b == 'J') {
                p ++;
            } else if(b == 'B') {
                s ++;
                aj ++;
            }
        } else if(a == 'B') {
            if(b == 'C') {
                s ++;
                ab ++;
            } else if(b == 'J') {
                f ++;
                bj ++;
            } else if(b == 'B') {
                p ++;
            }
        }
    }

    cout << s << " " << p << " " << f << endl;
    cout << f << " " << p << " " << s << endl;

    // ab  ac  aj
    if(ab >= aj && ab >= ac) cout << "B ";
    else if(ac >= aj && ac > ab) cout << "C ";
    else if(aj > ab && aj > ac) cout << "J ";
    
    // bb  bc  bj
    if(bb >= bj && bb >= bc) cout << "B" << endl;
    else if(bc >= bj && bc > bb) cout << "C" << endl;
    else if(bj > bb && bj > bc) cout << "J" << endl;

	return 0;
}

优化 AC - 高追求

合并优化 s、p、f 代码逻辑,代码缩减到 54 54 54 行。

#include <iostream>
using namespace std;

int main() {

    int n;
    cin >> n;
    
    // 胜平负记录一个甲的,乙的直接逆序输出即可
    int s = 0, p = 0, f = 0;
    int ac = 0, aj = 0, ab = 0;
    int bc = 0, bj = 0, bb = 0;
    while(n --) {
        char a, b;
        cin >> a >> b;

		if(a == b) {
			p ++;
		} else if(a == 'C' && b == 'J') {
			s ++;
			ac ++;
		} else if(a == 'J' && b == 'B') {
			s ++;
			aj ++;
		} else if(a == 'B' && b == 'C') {
			s ++;
			ab ++;
		} else if(b == 'C' && a == 'J') {
			f ++;
			bc ++;
		} else if(b == 'J' && a == 'B') {
			f ++;
			bj ++;
		} else if(b == 'B' && a == 'C') {
			f ++;
			bb ++;
		}
    }

    cout << s << " " << p << " " << f << endl;
    cout << f << " " << p << " " << s << endl;

    // ab  ac  aj
    if(ab >= aj && ab >= ac) cout << "B ";
    else if(ac >= aj && ac > ab) cout << "C ";
    else if(aj > ab && aj > ac) cout << "J ";
    
    // bb  bc  bj
    if(bb >= bj && bb >= bc) cout << "B" << endl;
    else if(bc >= bj && bc > bb) cout << "C" << endl;
    else if(bj > bb && bj > bc) cout << "J" << endl;

	return 0;
}
JAVA:Spring Boot 集成 Atomikos 实现分布式事务 摘要: Atomikos是一款基于JTA标准的分布式事务协调器,通过两阶段提交(2PC)协议实现跨数据库/消息系统的事务一致性,适用于金融等高要求场景。本文以Spring Boot集成Atomikos为例,演示多数据源(订单库、库存库)的分布式事务管理。核心步骤包括:引入Atomikos依赖、配置XA数据源、设置两阶段提交的MyBatis多数据源,并通过Atomikos协调全局事务,确保跨库操作原子性。代码示例涵盖配置类、YAML定义及MySQL XA数据源初始化,为分布式系统提供强一致性解决方案。 阅读详情

相关推荐

Linux环境下OpenSSH升级到 OpenSSH_9.8p1(内置保姆级教程并包含openssl升级过程)

2024年7月1日接到安全部门同事邮件通知,目前生产环境及测试环境服务器Openssh存在远程代码执行漏洞(CVE-2024-6387),漏洞等级高,且攻击者可以成功利用该漏洞获得远程root shell最高权限从而执行任意代码及命令,主要受影响版本为8.5p1

菜鸟运维升级之路 2万+

深挖C++:类和对象(中)

(先进后出)

xys_678的博客 248

从厘米级到公里级:北斗网格10级精度在ArcPro中的完整应用指南

本文提供了北斗网格十级精度体系在ArcGIS Pro中的完整应用指南。详细解析了从660公里到1.5厘米的十级网格尺度及其编码逻辑,并重点演示了如何在ArcPro中生成网格、计算编码,以及根据项目需求(如滑坡监测)选择合适精度层级的实战策略。指南旨在帮助GIS专业人士利用这套统一的网格框架,高效管理多尺度空间数据并优化分析工作流。

Black的专栏 472

C++移动构造函数详解

移动构造函数是C++11引入的一种特殊构造函数,用于从临时对象(右值)"窃取"资源来初始化新对象,而不是进行昂贵的深拷贝。char* data;public:// 移动构造函数:参数是右值引用 &&// 关键:把源对象的资源置空。

拒绝AI文,努力在AI时代写出感动人心的好文章 392

LatentSync:开源数字人唇形同步技术的实战部署与优化指南

本文详细介绍了开源数字人唇形同步工具LatentSync的实战部署与优化全流程。从核心原理(潜在扩散模型与TREPA技术)解析,到手把手完成环境搭建、模型获取及首次推理。文章深入探讨了自定义素材处理、关键参数调优(如guidance_scale),并提供了显存不足、人脸检测失败等常见问题的解决方案与性能优化技巧,旨在帮助用户高效部署并提升生成效果。

9o8p7i6u5y的博客 1008

ALSA音频开发实战:如何用snd_pcm_avail避免缓冲区溢出(附完整代码)

本文深入探讨了在ALSA音频开发中,如何利用`snd_pcm_avail`函数有效管理环形缓冲区,从而避免音频数据溢出或下溢。通过实战代码示例,详细解析了该函数在播放场景下的核心作用,即实时查询可写入的帧数,并构建了自适应写入循环以实现稳健的流量控制,确保音频流的平滑与稳定。

weixin_29183637的博客 461

ThunderKittens 深度解析:一个不基于 MLIR 的 C++ 模板 GPU DSL

Triton 是"让更多人能写 GPU kernel",ThunderKittens 是"让会写的人写得更爽"。前者用 MLIR 换易用性,后者用 C++ 模板换可控性。它们不是替代关系,而是覆盖了 GPU 编程光谱的两端。ThunderKittens 的出现,本质上是对"GPU DSL 必须基于 MLIR"这一默认假设的挑战。编译期类型系统本身就可以是一个强大的 DSL 基础设施,不需要中间 IR,不需要黑盒 pass,也能实现 tile 级抽象和零运行时开销。

Maxwell_Newton的博客 345

三菱FX5U运动控制(步进)

三菱FX5U脉冲定位控制,原点回归,相对定位,绝对定位,运动控制案例。

weixin_55762091的博客 1万+

跟我学c++中级篇—类型定义的方式

本文系统阐述了编程中类型定义的重要性及c++中的实现方式。重点对比了宏定义、typedef与modern using三种机制,指出using在可读性、灵活性和模板支持上的优势,推荐优先使用。同时提醒开发者注意别名滥用、类型歧义、错误信息冗长等问题,强调统一规范与合理设计。最终结论:在现代c++开发中,应以using为主,兼顾简洁性与可维护性,避免陷入命名混乱与编译困境。

fpcc的专栏 84

信号检测算法的MATLAB仿真:能量检测、循环平稳检测和匹配滤波检测

根据具体的应用场景和要求,选择合适的信号检测算法可以提高系统的性能和可靠性。在无线电通信中,信号检测是一项重要的任务,它用于检测和识别接收到的信号。在本文中,我们将介绍三种常用的信号检测算法:能量检测、循环平稳检测和匹配滤波检测,并提供相应的MATLAB源代码进行仿真实现。在上述代码中,我们首先设置了能量检测的阈值,然后生成了一个包含1000个服从正态分布的随机信号样本的信号。在上述代码中,我们首先设置了信号模板,然后生成了一个包含信号模板的信号样本。最后,通过比较相关性的最大值与阈值来判断信号是否存在。

PixelLancer的博客 1363

开关电源和线性电源Multisim电路仿真实验汇总——硬件工程师笔记

本文系统介绍了稳压电源的基础知识与应用实验。首先阐述了稳压电源的定义与类型,包括线性稳压电源(如LM7805/7905)和开关稳压电源(降压/升压/升降压式)的工作原理、参数特点及优劣势。随后详细讲解了各类稳压电源的实验设计,如线性稳压电源的电路实现、开关稳压电源的PWM控制方法等。最后汇总了硬件工程师相关的笔试面试资源,涵盖器件知识、电路仿真、企业真题等内容。全文结合理论分析与Multisim仿真,为电子工程学习者提供了稳压电源的实用技术参考。

XU157303764的博客 1640

【C语言】字符与字符串函数

C语言中字符串为以\0结尾的字符数组,标准库函数基于此约定。本文解析字符串内存布局,详解ctype.h与string.h中字符分类、长度计算、拷贝、比较等函数的使用要点,强调长度判断与越界风险,最后通过命令行待办事项示例整合fgets、sscanf、strncpy、strcmp,展示实际应用中的关键细节。

记录在学习过程中学到的知识 352

总结个人关于雷达样式的见解(脉内脉间调制)

概述 雷达有各种各样的脉内脉间调制样式,对于雷达的设计者来说,不外乎三个目的: 1、增加雷达性能,如提高测距精度,增大侦察距离等; 2、雷达的工作机制决定雷达必须采用此种样式的调制,如有些SAR雷达为保证径向测距精度,需要使用脉内宽带调制信号; 3、降低雷达被电子战装备截获的概率,也就是LPI设计。 对于雷达对抗方,则只会观察到信号存在脉内及脉间的调制。对于一般的雷达信号,通常只采用脉内调制,脉间频率调制,脉间PRI调制。 脉间调制类型 1、PD雷达的脉间特征 雷达进行脉间调制的主要是PRI..

年糕的博客 3万+

C++ 函数模版

模板参数:● template ,T 就是类型占位符,名字可以自定义,习惯用T● 占位符可以在函数返回值、形参、函数内部当作类型使用使用要点模板代码一般写在头文件:编译器需要看到完整模板源码,才能在每个编译单元完成实例化全局函数、类内成员函数都可以写成模板实例化发生在编译阶段,不是运行时隐式实例化:调用时编译器自动推导实参类型,生成对应版本函数。

2501_94041724的博客 306

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

#SQLite 数据库笔记一:(概念 / 终端指令 / SQL 语句 / C 编程 / 回调函数)

数据库 = 数据的仓库,假设数据是海量。能力说明存储数据持久化保存,程序退出数据还在统计数据、分组、排序数据管理增、删、改、查(CRUD)嵌入式设备上也会用数据库(单片机网关、路由器、工业 HMI 都常见),因为 sqlite 体积小、无需服务进程、单文件即可。数据库 = 库 > 表 > 记录(行) > 字段(列)sqlite3 = 开源、C 写的、单文件、免安装、最多 2T 的嵌入式关系型数据库。

lwq20051110的博客 218

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【C++ 基础入门】C++继承(下):问题、底层原理与组合

C++继承(菱形继承的问题、虚继承原理、继承与组合、构造顺序)

2601_96587588的博客 795

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级 备考:莫队算法离线区间查询详解

备赛进行时:第十八届蓝桥杯软件赛报名已于 2026-10-08 10:00 开启、12-18 14:00 截止,省赛定在 2027-04-10(C/C++·Python 程序设计 9:00–13:00);中国电子学会 2026 年 12 月软件编程(C/C++ 一级至十级、Python 一级至六级)考级报名 9/23–12/2 16:00、统考 12-12;全国青少年信息素养大赛 2026—2027 赛季算法应用主题赛也已进入复盘练兵窗口。

IT_Scratch的博客 159

825 mW 顶上 212 °C:ASM491S 的 105 °C/W、250 mA 短路电流与热关断

25 °C 环境里结温 34.1 °C,125 °C 环境里结温 134.1 °C——后者已经离 150 °C 只有 16 °C 了,但还在范围内。换个角度看同一件事:从 25 °C 和从 125 °C 起算,温升都是 86.6 °C,但一个到 111.6 °C(还在范围内),一个到 211.6 °C(远远超限)。这个算例里 20 °C/W 是我假设的,实际值取决于机壳材料、密封程度、有没有风扇,跨度可以从 5 °C/W 到 50 °C/W 以上。外面 50 °C 的机箱,盒内就是 63.9 °C。

ANSILIC的博客 363

《C++ 项目:手写大模型接入 SDK》Gemini接口设计(上):初始化、全量响应实现和测试

本文系统完成了Gemini模型通过OpenAI兼容API的接入开发,基于Apifox验证接口规范,设计并实现GeminiProvider类,涵盖初始化、状态检测、全量响应等核心功能。重点处理了代理配置强制校验、Bearer鉴权、JSON序列化与响应解析等工程细节,并通过GTest与CMake完成单元测试,验证链路可用性。项目遵循策略模式,保持与DeepSeek、ChatGPT等模型的统一抽象接口,显著提升SDK可扩展性。

2501_91275995的博客 393

【容斥原理计数】题解:P9489 ZHY的表示法_容斥原理_计数问题_前缀和问题转化_算法竞赛C++

给定 $ n $ 个正整数,求区间 $[l,r]$ 中有多少正整数 $ x $ 可表示为 $ \sum \lfloor \frac{y}{x_i} \rfloor $。通过二分确定最大 $ y $,转化为求 $ 1 \sim H $ 中是某些 $ x_i $ 倍数的数的个数,利用容斥原理与 DFS 枚举子集计算,结合 LCM 预判剪枝及去重优化,时间复杂度 $ O(2^n \log V) $,可高效处理 $ r \le 10^9 $ 的数据。

YLCHUP的博客 43

头歌 数据结构——C&C++线性表实训

本系列任务围绕线性表的链式实现,依次完成顺序构建、逆序构建、排序插入、查找、删除、求长度及栈、队列、集合等应用。通过动态内存分配与指针操作,掌握单链表的基本操作与实际应用,涵盖插入、删除、遍历、搜索等核心功能,最终实现数据结构在典型场景中的灵活运用。

一名敲代码的苦13程序员 240

C++ vector 添加与删除元素的底层原理:erase 返回值与倒序遍历删除

vector是连续内存的动态数组,支持O(1)随机访问,但扩容时需重新分配内存并搬迁元素。push_back和emplace_back均摊时间复杂度为O(1),扩容策略(如2倍或1.5倍)确保总代价均摊;insert与erase在中间位置操作需移动元素,时间复杂度O(n),且使后续迭代器失效。删除指定元素推荐使用erase-remove惯用法或std::erase_if,避免逐个删除导致O(n²)复杂度。从后往前遍历可防止漏删,但最优解仍是高效惯用法。预估容量后调用reserve()可避免频繁扩容,提升性能

2402_85743155的博客 798

字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)

本题核心思想是:最少移动步数 = 总长度 - 可保留的最长连续子串长度。未移动字母在T中必须为连续子串,在S中需保持相对顺序(即子序列)。通过枚举T的所有连续子串起点,贪心匹配S中的对应字符,求出最长可保留长度L,答案即为n−L。时间复杂度O(n²),空间复杂度O(n),适用于n≤1000。

冻柠茶飞冰走茶 588

【C语言】内存函数

本文介绍C语言中按字节操作的内存函数(memcpy、memmove、memset、memcmp、memchr),强调其长度参数以字节为单位,适用于二进制数据。重点解析memcpy不允许重叠的原因及memmove通过判断相对位置选择复制方向来安全处理重叠场景,并结合动态数组的插入与删除操作,展示memmove的实际应用。

记录在学习过程中学到的知识 329

C++ 标准库算法全景指南

本文系统梳理C++标准库<algorithm>与<numeric>中100+算法,按功能分为非修改、修改、排序、二分查找、归并、堆、极值、字典序、排列及数值操作十大类,涵盖典型用法与时间复杂度。结合C++20范围(ranges)与投影特性,实现更简洁高效的代码。

sss123ddd的博客 363

CuTe 与 CuTe DSL:从 C++ 模板元编程到 Python DSL 的 GPU 编程演进

CuTe 的价值不在于它"好用",而在于它把 GPU 编程中最难表达的部分——布局与线程映射——变成了可以做代数运算的数学对象。它坚持 C++ 模板路线,拒绝引入编译器黑盒,换来了极致的可控性与性能上限,代价是陡峭的学习曲线与糟糕的报错体验。CuTe DSL 的出现,说明这个团队也意识到了"曲高和寡"的问题,正在尝试用 Python 的易用性包裹 C++ 模板的强大。未来 CuTe 大概率会继续扮演"底层布局中间层"的角色,而 DSL 层则负责把这份能力交付给更多开发者。

Maxwell_Newton的博客 256
上一篇: 【PAT乙级】题解-1022 D进制的A+B
下一篇: 【PAT乙级】题解-1087 有多少不同的值
老坛算粉
博客等级 码龄12年 708粉丝 73原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老坛算粉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值