HDU1043 Eight(逆向BFS/A*/双向bfs/IDA*)

lego-loam featureAssociation 源码注释(五) 上一次我们已经看完了特征提取,这次我们进入特征匹配的内容!!!systemInitedLM的初始值为false。 阅读详情

八数码
cantor 展开:一个全排列的rank,用来hash
逆向bfs:62msAC

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f
const LL mod=1e9+7;
const double eps=1e-9;
string Input;
char str[10];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
char predir[5]="udlr";
int nxt[500000];
int op[500000];
int is[500000];
struct node{
    char mp[10];
    int x,y;
};
int cantor(char *s){
    int ans=0;
    for(int i=0;i<8;++i){
        for(int j=i+1;j<9;++j)if(s[j]<s[i])ans++;
        ans*=(8-i);
    }
    return ans;
}
int trans(int x,int y){
    return 3*(x-1)+y-1;
}
void bfs(){
    node st;
    for(int i=0;i<9;i++){st.mp[i]=i;}
    st.x=3,st.y=3;
    int sthsh=cantor(st.mp);
    is[sthsh]=1;nxt[sthsh]=-1;
    queue<node>mq;
    mq.push(st);
    while(!mq.empty()){
        node nw=mq.front();
        mq.pop();int prehsh=cantor(nw.mp);
        for(int i=0;i<4;i++){
            node pp=nw;
            int nxtx=pp.x+dx[i];
            int nxty=pp.y+dy[i];
            if(nxtx<1||nxtx>3||nxty<1||nxty>3)continue;
            swap(pp.mp[trans(pp.x,pp.y)],pp.mp[trans(nxtx,nxty)]);
            int hsh=cantor(pp.mp);
            if(is[hsh])continue;
            pp.x=nxtx,pp.y=nxty;op[hsh]=i;nxt[hsh]=prehsh;
            is[hsh]=1;
            mq.push(pp);
        }
    }
}
void print(int q){
    if(!q){cout<<endl;return ;}
    cout<<predir[op[q]];
    print(nxt[q]);
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    bfs();
    while(getline(cin,Input)){
        int k=0;
        for(int i=0;i<Input.length();i++){
            if(Input[i]=='x'){
                Input[i]='9';
            }
            if(Input[i]==' ')continue;
            str[k++]=Input[i];
        }
        int hsh=cantor(str);
        if(is[hsh])print(hsh);
        else cout<<"unsolvable"<<endl;
    }
    return 0;
}

A* 655ms
估价函数是除了*以外,其他数归位的曼哈顿距离和

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f
const LL mod=1e9+7;
const double eps=1e-9;
string Input;
char str[10];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
char nxtdir[5]="durl";
char predir[5]="udlr";
int nxt[500000];
int pre[500000];
int op[500000];
int is[500000];
struct node{
    char mp[10];
    int x,y;
    int g,h;
    bool operator <(const node &a)const{
        return g+h>a.g+a.h;
    }
};
int cantor(char *s){
    int ans=0;
    for(int i=0;i<8;++i){
        for(int j=i+1;j<9;++j)if(s[j]<s[i])ans++;
        ans*=(8-i);
    }
    return ans;
}
int solvable(char *s){
    int cnt=0;
    for(int i=0;i<8;i++){
        if(s[i]==9)continue;
        for(int j=i+1;j<9;j++){
            if(s[j]==9)continue;
            if(s[i]>s[j])cnt++;
        }
    }
    return !(cnt&1);
}
int trans(int x,int y){
    return 3*(x-1)+y-1;
}
int get_h(char *s){
    int h=0;
    for(int i=0;i<9;i++){
        if(s[i]!=9)h+=(abs(i/3-(s[i]-1)/3)+abs(i%3-(s[i]-1)%3));
    }
    return h;
}
priority_queue<node>mq;
void Astar(node st,node ed){
    memset(is,0,sizeof is);
    while(!mq.empty())mq.pop();
    int sths=cantor(st.mp);
    int edhs=cantor(ed.mp);
    is[sths]=1;op[sths]=-1;st.g=0;
    mq.push(st);
    while(!mq.empty()){
        node nw=mq.top();
        mq.pop();
        int nwhs=cantor(nw.mp);
        if(nwhs==edhs)break;
        for(int i=0;i<4;i++){
            node pp=nw;
            int nxtx=nw.x+dx[i];
            int nxty=nw.y+dy[i];
            if(nxtx>3||nxtx<1||nxty>3||nxty<1)continue;
            swap(pp.mp[trans(pp.x,pp.y)],pp.mp[trans(nxtx,nxty)]);
            pp.x=nxtx;
            pp.y=nxty;
            int pphs=cantor(pp.mp);
            if(is[pphs])continue;
            pp.g++;op[pphs]=i;nxt[pphs]=nwhs;
            pp.h=get_h(pp.mp);
            is[pphs]=1;
            mq.push(pp);
        }
    }
}
void print(int q,int sthsh){
    if(q==sthsh){return ;}
    print(nxt[q],sthsh);
    cout<<nxtdir[op[q]];
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    node ed;
    for(int i=0;i<9;i++)ed.mp[i]=i+1;
    while(getline(cin,Input)){
        int k=0;
        node st;
        for(int i=0;i<Input.length();i++){
            if(Input[i]=='x'){
                Input[i]='9';
                st.x=k/3+1;
                st.y=k%3+1;
            }
            if(Input[i]==' ')continue;
            st.mp[k++]=Input[i]-'0';
        }
        if(solvable(st.mp)){
            Astar(st,ed);
            print(cantor(ed.mp),cantor(st.mp));
            cout<<endl;
        }
        else cout<<"unsolvable"<<endl;
    }
    return 0;
}

双向bfs 670ms

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f
const LL mod=1e9+7;
const double eps=1e-9;
string Input;
char str[10];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
char nxtdir[5]="durl";
char predir[5]="udlr";
int nxt[2][500000];
int op[2][500000];
int is[500000];
struct node{
    char mp[10];
    int x,y;
    int d,hsh;
};
int cantor(char *s){
    int ans=0;
    for(int i=0;i<8;++i){
        for(int j=i+1;j<9;++j)if(s[j]<s[i])ans++;
        ans*=(8-i);
    }
    return ans;
}
int solvable(char *s){
    int cnt=0;
    for(int i=0;i<8;i++){
        if(s[i]==9)continue;
        for(int j=i+1;j<9;j++){
            if(s[j]==9)continue;
            if(s[i]>s[j])cnt++;
        }
    }
    return !(cnt&1);
}
int trans(int x,int y){
    return 3*(x-1)+y-1;
}
void printpre(int q,int sthsh){
    if(q==sthsh){return ;}
    printpre(nxt[0][q],sthsh);
    cout<<nxtdir[op[0][q]];
}
void printnxt(int q,int edhsh){
    if(q==edhsh){return ;}
    cout<<predir[op[1][q]];
    printnxt(nxt[1][q],edhsh);

}
void bibfs(node st,node ed){
    memset(is,-1,sizeof is);
    queue<node>mq[2];
    st.d=0;ed.d=0;
    st.hsh=cantor(st.mp);
    ed.hsh=cantor(ed.mp);
    is[st.hsh]=0,is[ed.hsh]=1;
    mq[0].push(st);
    mq[1].push(ed);
    int opq;
    while(!mq[0].empty()||!mq[1].empty()){
        if(mq[0].size()<mq[1].size())opq=0;
        else opq=1;
        node tmp=mq[opq].front();
        while(!mq[opq].empty()){
            if(mq[opq].front().d!=tmp.d)break;
            node nw=mq[opq].front();mq[opq].pop();
            for(int i=0;i<4;i++){
                node pp=nw;
                int nxtx=pp.x+dx[i];
                int nxty=pp.y+dy[i];
                if(nxtx<1||nxtx>3||nxty<1||nxty>3)continue;
                swap(pp.mp[trans(nxtx,nxty)],pp.mp[trans(pp.x,pp.y)]);
                pp.x=nxtx;
                pp.y=nxty;
                pp.d=nw.d+1;
                pp.hsh=cantor(pp.mp);
                if(is[pp.hsh]==opq){continue;}
                else {
                    nxt[opq][pp.hsh]=nw.hsh;
                    op[opq][pp.hsh]=i;
                    if(is[pp.hsh]==(opq^1)){
                        printpre(pp.hsh,st.hsh);
                        printnxt(pp.hsh,ed.hsh);
                        return ;
                    }
                    mq[opq].push(pp);
                    is[pp.hsh]=opq;
                }
            }
        }
    }
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    node ed;
    for(int i=0;i<9;i++)ed.mp[i]=i+1;
    ed.x=3,ed.y=3;
    while(getline(cin,Input)){
        int k=0;
        node st;
        for(int i=0;i<Input.length();i++){
            if(Input[i]=='x'){
                Input[i]='9';
                st.x=k/3+1;
                st.y=k%3+1;
            }
            if(Input[i]==' ')continue;
            st.mp[k++]=Input[i]-'0';
        }
        if(solvable(st.mp)){
            bibfs(st,ed);
            cout<<endl;
        }
        else cout<<"unsolvable"<<endl;
    }
    return 0;
}

IDA* 702ms 可能写的太搓了。。。初始化有点花时间

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f
const LL mod=1e9+7;
const double eps=1e-9;
string Input;
char str[10];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int is[500000];
char nxtdir[5]="durl";
char predir[5]="udlr";
stack<char>ans;
struct node{
    char mp[10];
    int x,y,h,hsh;
}st;
int cantor(char *s){
    int ans=0;
    for(int i=0;i<8;++i){
        for(int j=i+1;j<9;++j)if(s[j]<s[i])ans++;
        ans*=(8-i);
    }
    return ans;
}
int solvable(char *s){
    int cnt=0;
    for(int i=0;i<8;i++){
        if(s[i]==9)continue;
        for(int j=i+1;j<9;j++){
            if(s[j]==9)continue;
            if(s[i]>s[j])cnt++;
        }
    }
    return !(cnt&1);
}
inline int trans(int x,int y){return 3*(x-1)+y-1;}
int get_h(char *s){
    int h=0;
    for(int i=0;i<9;i++)if(s[i]!=9)h+=(abs(i/3-(s[i]-1)/3)+abs(i%3-(s[i]-1)%3));
    return h;
}
int debug(){
    for(int i=0;i<9;i++)cout<<(int)st.mp[i];
    cout<<' '<<st.h<<endl;
}
int IDA(int mxd,int d){
    //debug();
    if(!st.h)return 1;
    if(d+st.h>mxd||is[st.hsh]<d)return 0;
    is[st.hsh]=d;
    node tmp=st;
    for(int i=0;i<4;i++){
        st.x=tmp.x+dx[i];
        st.y=tmp.y+dy[i];
        if(st.x>3||st.x<1||st.y<1||st.y>3){st=tmp;continue;}
        swap(st.mp[trans(st.x,st.y)],st.mp[trans(tmp.x,tmp.y)]);
        st.hsh=cantor(st.mp);
        st.h=get_h(st.mp);
        if(IDA(mxd,d+1)){ans.push(nxtdir[i]);return 1;}
        st=tmp;
    }
    //debug();
    return 0;
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    while(getline(cin,Input)){
        int k=0;
        for(int i=0;i<Input.length();i++){
            if(Input[i]=='x'){
                Input[i]='9';
                st.x=k/3+1;
                st.y=k%3+1;
            }
            if(Input[i]==' ')continue;
            st.mp[k++]=Input[i]-'0';
        }
        st.h=get_h(st.mp);
        st.hsh=cantor(st.mp);
        if(solvable(st.mp)){
            memset(is,INF,sizeof is);
            for(int i=st.h;!IDA(i,0);i++){}
            while(!ans.empty()){cout<<ans.top();ans.pop();}
            cout<<endl;
        }
        else cout<<"unsolvable"<<endl;
    }
    return 0;
}

零基础学习simulink-- 基于自适应模糊PID控制的直流电机速度控制系统 通过上述代码实现,您可以逐步创建和搭建一个基于自适应模糊PID控制的直流电机速度控制系统。该系统能够根据电机的状态和误差实时调整PID参数,确保电机速度稳定在设定范围内。自适应模糊PID控制具有较强的鲁棒性和适应性,能够在存在不确定性和扰动的情况下提供快速且精确的控制性能。Simulink提供了强大的建模和仿真工具,使得控制系统工程师能够快速构建复杂的控制算法,并将其应用于实际工程中。直流电机建模:建立直流电机的动态模型,包括电枢电压、电流、转速和负载扭矩。自适应模糊PID控制器设计。 阅读详情

相关推荐

Windows/Mac/Linux三系统保姆级教程:用llama.cpp将safetensors模型转gguf格式(附常见错误解决)

本文提供Windows、Mac和Linux系统下使用llama.cpp将safetensors模型转换为gguf格式的详细教程,涵盖环境配置、转换原理及常见错误解决方案。通过跨平台兼容性处理,帮助开发者高效完成模型格式转换,优化边缘计算性能。

weixin_29227425的博客 270

HDU Eight (BFS+康拓展开)

HDU1043 Eight 题目 给出数字八数码游戏的一种棋局状态,求完成游戏的步骤,输出 任意一种即可 思路 每种对弈状态可以抽象成一个19的数字排列,所以所有的可能就是19的全排列,总共是10610^6106级,因此可以穷举。 考虑搜索,从初始态穷举所有状态。首先,如何搜索,如果使用BFS,显然会造成重复,并且无法通过简单的打标记方法解决。 但是,我们可以通过对他们的全排列进行编号,这样就可以采用标记解决。 那么,解决如何快速获取一对弈状态的全排列编号的问题。 我们可以使用康拓展开,排列的编号是倒

weixin_58110654的博客 245

Python逆向爬取Tik Tok,MsToken,X-Bogus以及signature

tiktok作为字节海外的自媒体平台,具有很非常大的价值,本文旨在教会大家实现Tik Tok的签名获取以及数据的最终爬取。

weixin_74305707的博客 3270

8数码 HDU-Eight (A*算法+bfs+康托展开+优先队列)

                                               Eight                                               Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)                 ...

xiaoyao_zhang的博客 1538

硬件开发实践:高速 PCB 差分信号与时钟同步优化

由两条互补信号线组成(正负极)接收端只关注两线之间电压差共模噪声对两线同时作用,可被抵消。

2501_93174775的博客 394

【GD32篇】驱动AD7616完成数据采集

GD32F10X驱动AD7616完成数据采集

we_long的博客 1万+

BFS逆向---01矩阵 leetcode

01 矩阵 给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。 两个相邻元素间的距离为 1 。 示例 1: 输入: 0 0 0 0 1 0 0 0 0 输出: 0 0 0 0 1 0 0 0 0 示例 2: 输入: 0 0 0 0 1 0 1 1 1 输出: 0 0 0 0 1 0 1 2 1 注意: 给定矩阵的元素个数不超过 10000。 给定矩阵中至少有一个元素是 0。 矩阵中的元素只在四个方向上相邻: 上、下、左、右。 一开始的时候是想到BFS,从某个1出发,然后扩散,找到0.

BOWWOB的博客 326

嵌入式调光控制库:轻量级软启/渐变/记忆逻辑实现

调光控制是智能照明系统的核心基础功能,涉及亮度调节、人机交互与电气安全多重需求。其底层原理依赖于对相位角或PWM占空比的精确时序控制,并需融合软启动、渐变过渡、状态记忆等工程化逻辑。这类轻量级调光行为逻辑层,不直接操作硬件寄存器,而是以确定性、无动态内存、可配置的方式封装用户意图到目标亮度值(0–100%)的映射过程,显著提升产品鲁棒性与跨平台复用能力。广泛应用于TRIAC交流调光、LED直流PWM驱动及DALI/Matter等智能照明协议网关中,尤其适合资源受限的Cortex-M系列MCU和FreeRTO

weixin_28949937的博客 579

HDU 1043(逆向BFS)

problem 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 x 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4 5 6 7 8 5 6 7 8 5 6 7 8 5 6 7 8 9 x 10 12 9 10 x ...

Feynman1999的博客 388

(8-5)图像特征提取:基于LoG、DoG 和DoH 的斑点检测器

然后,根据给定的参数(标准差、尺度因子),通过调用cv2.GaussianBlur函数创建了两个不同尺度的高斯滤波器,并对图像进行滤波操作。然后,通过遍历DoG滤波器的每个像素,检测局部极值点,并将其添加到关键点列表中。然后,通过遍历DoH滤波器的每个像素,检测局部极值点,并将其添加到关键点列表中。接下来,通过遍历滤波器的每个像素,检测局部极值点,并将其添加到关键点列表中。DoH是一种基于Hessian矩阵的特征检测方法,通过计算Hessian矩阵的行列式来检测图像中的斑点。:实现DoH斑点检测器。

码农三叔 1606

KUKA机器人在自动运行时,动作不流畅,每个点位都有停顿的解决办法

KUKA机器人在自动运行时,动作不流畅,每个点位都有停顿的解决办法

Robot_PLC_HMI_Automation 4577

hdu1043Eight (经典的八数码)(康托展开+BFS)

建议先学会用康托展开: Problem Description The 15-puzzle has been around for over 100 years; even if you don't know it by that name, you've seen it. It is constructed with 15 sliding tiles, each with a num

青山绿水之辈 专栏 3429

ThingsBoard PE专业版解决方案技术文档——温度&湿度

温湿度解决方案

weixin_67440240的博客 818

hdu1043八数码 bfs 打表/双向bfs/A*+康托判重+逆序奇偶剪枝

写之前拜读了这篇文章:八数码的八境界 个人觉得写顺序为 一(可写可不写,介意找工作的的人最好试试这种写法)-->三 -->二 -->四 -> 六-->八 境界一、暴力广搜+STL 判重方法: setvis;set红黑树实现,查找效率log(n);总的效率nlog(n)(10^6),肯定会TLE #include #include #include #include #inc

pmt123456的博客 1450

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

HDU1043——八数码IDA*算法

之前写八数码用了广搜,从目标状态扩展路径,把所有可以走到的状态都标记起来,然后输入后直接判断这个状态是否被标记过,但是在poj上正确,在HDU上一直超时,poj时间是5000ms,HDU是1000ms,妥妥的超了,wrong使我进步,又恶补了IDA*的知识。先介绍一下我理解的IDA*,首先判断当前数码位置状态与目标数码位置状态是否可互达(后附简单介绍),如果不可以直接剪枝,如果可以,就算出当前状态...

uyret的博客 772

Devexpress16.2.6破解工具

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

HDU-1043 双向BFS/单BFS+康托展开/逆序数奇偶性

原作链接:https://blog.youkuaiyun.com/mengxingyuanlove/article/details/49049777向作者致敬

SoulGuide的博客 329

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

hdu 1043 Eight 双向BFS/A*算法

终于被我水过了,哈哈,45

冷月之殇 6602

HDU(1043):八数码的 A* 与 双BFS算法

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1043   说实话,这道题我算是写了很久了,这道题当然也让我收获甚多,作为新手,刚开始的话,我是用 map作为标识,显然这样是行不通的。直到后来,百度上意外搜到了bin神的代码,运用逆序枚举的方法,后面直接打表就行行了,我提交的代码:http://blog.youkuaiyun.com/i_am_a_winer/a

catch_catch的专栏 2019

hdu1043 Eight (八数码问题,多种解法)

hdu1043 :http://acm.hdu.edu.cn/showproblem.php?pid=1043 八数码问题       有一个3*3的棋盘,其中有0-8共9个数字,0表示空格,其他的数字可以和0交换位置。求由初始状态到达目标状态 123  456  780 的步数最少的解? 有多组数据 解法: 1、反向BFS + hash( cantor展开 ) 因为状态总

天亮说晚安 4411

hdu 1043 八数码路径 双向bfs + 康拓展开hash + 判无解剪枝

题意: 输出八数码的路径。 题解: 1.以给出的数字为起点,以最终的目标数字为另一起点,进行双向bfs。 2.康拓展开hash可以标记和存储路径,但是因为9e8过大,map只能标记而不能存储路径。 康拓展开讲解:https://blog.youkuaiyun.com/qq_38701476/article/details/81003290 3.本来前两步写完后认为大功告成,结果差了判无解的剪枝一直...

Irving0323的博客 344

[HDU 1043] Eight A*或IDA*

将八数码变成1 2 3 4 5 6 7 8 x

AcmHonor的专栏 772

HDU-1043 逆向bfs 打表

Problem Description The 15-puzzle has been around for over 100 years; even if you don’t know it by that name, you’ve seen it. It is constructed with 15 sliding tiles, each with a number from 1 to 15 o...

刷题记录 321

HDU Eight

/** 学长要俄们学下康托~ 康托展开式的神奇应用:可以把一组数的全排列一一对应到某个排列的在所有排列的顺序位置上; 比如{1, 2, 3}有6个全排列, 给出{3, 2, 1}就能计算出是第几个排列, 这样相比直接hash的空间 就能从333减少到6 , 神奇~

极度猥琐 956

八数码与IDA*问题 HDU1043&&POJ1077

HDU1043&&POJ1077 题意:将八数码还原成原位 做法(参照各种神牛牪犇) 1.判断是否有解,原位时八数码的逆序对一定是0,细心的人就会发现每次移动的逆序对是偶数次变换的,所以只用判断初始情况的逆序对是否为偶数即可 2.强力剪枝:1.用H最优估计剩余步数(曼哈顿距离) 2.限制深度deep,每次加一 3.判断与上一步是否反向 3.IDA*  每次限制层数加一,逐层搜索。

小菜鸟。。 318

HDU 1043 Eight

题目大意:同POJ 1077 Eight相同,只不过有多个测例(以EOF

源代码 1877

hdu 1043 eight 八数码问题

八数码这个游戏估计大多数人都玩过。就是给你一个3*3的矩阵,有一个空格。你可以将这个空格左边、右边、上面、下面的数字移到这个空格。要你利用这个空格达到目标状态。 比如: 1 2 3             1 2 3                                                                   1 2 3 x 4 6    -

yunfanfighting的专栏 1430
上一篇: 概率dp入门小结
下一篇: hdu2567 EightII(IDA*/逆向BFS打表)
IDrandom
博客等级 码龄12年 31粉丝 125原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值