算法竞赛入门经典第四章

cmath

double hypot(double x, double y);//计算直角三角形的斜边长

数组作为函数的参数和返回值实际上只传递首址
函数作为函数的参数:. XXX(…,bool (*cmp)(int a,int b)){…}
例题4-1
https://vjudge.net/problem/UVA-1339
只要个数对得上即可

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main() {
    string s, t;
    while (cin >> s >> t) {
        int A[2][26] = {};
        for (int i = 0;i<s.length();++i){
            ++A[0][s[i] - 'A'];
            ++A[1][t[i] - 'A'];
        }
        sort(A[0], A[0] + 26);
        sort(A[1], A[1] + 26);
        bool flag = true;
        for (int i = 0; i < 26; ++i)
            if (A[0][i] != A[1][i]) { flag = false; break; }
        if (flag) cout << "YES" << endl;
        else cout << "NO" << endl;
    }
}

例题4-2
https://vjudge.net/problem/UVA-489

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main() {
    string s, t;
    int cnt;
    while (cin >> cnt && cnt != -1) {
        int vis[26] = {};
        cin >> s >> t;
        int L = s.length();
        for (int i = 0; i < L; ++i)
            ++vis[s[i] - 'a'];
        int nn = 7;
        for (int i = 0; i < t.size(); ++i) {
            if (vis[t[i]-'a']) {L -= vis[t[i]-'a']; vis[t[i]-'a'] = 0;}
            else if (!(--nn)) break;
            if (!L) break;
        }
        printf("Round %d\n",cnt);
        if (!L) printf("You win.\n");
        else if (nn) printf("You chickened out.\n");
        else printf("You lose.\n");
    }
}

例题4-3
https://vjudge.net/problem/UVA-133

#include<iostream>
#pragma warning(disable:4996)
using namespace std;
int main() {
    char s[10];
    int n, k, m; int vis[1045] = {};//vis[0]=0;
    while (cin >> n >> k >> m && (n || k || m)) {
        for (int i = 1; i <= n; ++i)
            vis[i] = 1;
        int A = 0, B = 0;
        int cnt = n;
        while (cnt) {
            if (cnt != n) cout << ",";
            int K = k, M = m;
            while (K) {
                A = (A + 1) % (n+1);
                if (vis[A]) K--;
            }
            while (M) {
                B = (B + n) % (n + 1);//-1+n+1=n
                if (vis[B]) M--;    
            }
            if (A != B) {
                cnt -= 2;
                vis[A] = vis[B] = 0;
                printf( "%3d%3d", A, B);
            }
            else {
                --cnt;
                vis[A] = 0;
                printf( "%3d", A);
            }
        }
        cout << endl;
    }
}

例题4-4
https://vjudge.net/problem/UVA-213
任意进制输出

//要转换的数字,写入转换结果的目标字符串,基数
char*itoa(int value,char*string,int radix);
#include<iostream>
#include<string>
#pragma warning(disable:4996)
using namespace std;
char code[8][1 << 8];
int get_val(string s) {
    int ans = 0;
    for (int i = 0; i < s.size(); ++i)
        ans = ans * 2 + s[i] - '0';
    return ans;
}
string get_nstr(int len) {
    string s;char e; 
    while (e = getchar())
        if (e != '\n' && e != '\r')
            if ((s += e).size() == len) return s;
}
int main() {
    string s;
    while (getline(cin, s)) {
        int L = -1;
        for (int i = 1; i < 8; ++i) {
            int M = 1 << i;
            for (int j = 0; j <= M - 2; ++j) {
                if (L < (int)s.length() - 1) code[i][j] = s[++L];
                else break;
            }
            if (L >= s.length() - 1) break;
        }
        while (true) {
            if ((s = get_nstr(3)) == "000") break;
            int len = get_val(s);
            while (true) {
                string ss(len, '1');
                if ((s = get_nstr(len)) == ss) break;
                cout << code[len][get_val(s)];
            }
        }
        cout << endl;
        s = ""; getchar();//读去最后的换行符
    }
}

例题4-5
https://vjudge.net/problem/UVA-512

#include<iostream>
#include<string>
#include<cstring>
#pragma warning(disable:4996)
using namespace std;
struct node {
    int hang,lie;
    bool is_die = false;
};
node all[55][55];
int r, c;
string s;
node t1, t2;
int vis[55];
int main() {
    int cnt = 0;
    while (cin >> r >> c && (r || c)) {
        if (cnt) printf("\n");
        printf("Spreadsheet #%d\n", ++cnt);
        int n, m, x;
        for (int i = 1; i <= r; ++i)
            for (int j = 1; j <= c; ++j)
                all[i][j].hang = i, all[i][j].lie = j,all[i][j].is_die=false;
        cin >> n;
        while (n--) {
            cin >> s;
            switch (s[0] * 1000 + s[1])
            {
            case 'E' * 1000 + 'X':
                cin >> t2.hang >> t2.lie >> t1.hang >> t1.lie;
                for (int i = 1; i <= r; ++i)
                    for (int j = 1; j <= c; ++j) {
                        if (!all[i][j].is_die && all[i][j].hang == t1.hang && all[i][j].lie == t1.lie)
                            all[i][j].hang = t2.hang, all[i][j].lie = t2.lie;
                        else if (!all[i][j].is_die && all[i][j].hang == t2.hang && all[i][j].lie == t2.lie)
                            all[i][j].hang = t1.hang, all[i][j].lie = t1.lie;
                    }
                break;
            case 'D' * 1000 + 'R':
                cin >> m;
                memset(vis, 0, sizeof(vis));
                while (m--) {
                    cin >> x;
                    ++vis[x];
                }
                for (int i = 1; i <= r; ++i)
                    for (int j = 1; j <= c; ++j)
                        if (!all[i][j].is_die && vis[all[i][j].hang]) all[i][j].is_die = true;
                for (int i = 1; i <= 50; ++i)
                    vis[i] += vis[i - 1];
                for (int i = 1; i <= r; ++i)
                    for (int j = 1; j <= c; ++j)
                        if (!all[i][j].is_die) all[i][j].hang -= vis[all[i][j].hang];
                break;
            case 'D'*1000 + 'C':
                cin >> m;
                memset(vis, 0, sizeof(vis));
                while (m--) {
                    cin >> x;
                    ++vis[x];
                }
                for (int i = 1; i <= r; ++i)
                    for (int j = 1; j <= c; ++j)
                        if (!all[i][j].is_die && vis[all[i][j].lie]) all[i][j].is_die = true;
                for (int i = 1; i <= 50; ++i)
                    vis[i] += vis[i - 1];
                for (int i = 1; i <= r; ++i)
                    for (int j = 1; j <= c; ++j)
                        if (!all[i][j].is_die) all[i][j].lie -= vis[all[i][j].lie];
                break;
            case 'I' * 1000 + 'R':
                cin >> m;
                memset(vis, 0, sizeof(vis));
                while (m--) { cin >> x; ++vis[x]; }
                for (int i = 1; i <= 50; ++i)
                    vis[i] += vis[i - 1];
                for (int i = 1; i <= r; ++i)
                    for (int j = 1; j <= c; ++j)
                        if (!all[i][j].is_die) all[i][j].hang += vis[all[i][j].hang];
                break;
            case 'I' * 1000 + 'C':
                cin >> m;
                memset(vis, 0, sizeof(vis));
                while (m--) { cin >> x; ++vis[x]; }
                for (int i = 1; i <= 50; ++i)
                    vis[i] += vis[i - 1];
                for (int i = 1; i <= r; ++i)
                    for (int j = 1; j <= c; ++j)
                        if (!all[i][j].is_die) all[i][j].lie += vis[all[i][j].lie];
                break;
            default:
                break;
            }
        }
        cin >> n;
        while (n--) {
            cin >> r >> c;
            if (all[r][c].is_die) printf("Cell data in (%d,%d) GONE\n", r, c);
            else printf("Cell data in (%d,%d) moved to (%d,%d)\n", r, c, all[r][c].hang, all[r][c].lie);
        }
    }
}

例题4-6
https://vjudge.net/problem/UVA-12412
注意选择4的时候,Showing the ranklist hurts students’ self-esteem. Don’t do that.\n的”’,oj上似乎是’’’
还有选择5的时候,如果数据直接复制到vs上,会自动在:前补空格变成subject : xx而非subject: xx;注意人数为0的情况
唉,体验好差!!!

#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<list>
#include<algorithm>
#pragma warning(disable:4996)
using namespace std;
map<string, int> vis;
int rak[405];
const double EPS = 1e-5;
string subj[4] = { "Chinese","Mathematics","English","Programming" };
struct stu {
    string name,SID;
    int CID,sub_grade[5];
};
list<stu> student;
struct clas {
    int pass_num[4];//通过人数
    int grade[5];//各科总分
    int all_num,p[5];//总人数,通过0~4科人数...
};
clas all[25];//all[0]存全校的数据
void add_del(stu &t,int flag) {//flag=1是插入,是引用!
    int sum = 0;
    int ans = 0;
    all[0].all_num+= flag;
    all[t.CID].all_num+= flag;
    for (int i = 0; i < 4; ++i) {
        sum += t.sub_grade[i];
        all[0].grade[i] += flag*t.sub_grade[i];
        all[t.CID].grade[i] += flag * t.sub_grade[i];
        if (t.sub_grade[i] >= 60) {
            all[0].pass_num[i] += flag;
            all[t.CID].pass_num[i] += flag;
            ++ans;
        }
    }
    t.sub_grade[4] = sum;
    for (int i = 1; i < sum; ++i)
        rak[i] += flag;
    all[0].p[ans] += flag;
    all[t.CID].p[ans] += flag;
}
void Print_menu() {
    printf("Welcome to Student Performance Management System (SPMS).\n\n1 - Add\n2 - Remove\n3 - Query\n4 - Show ranking\n5 - Show Statistics\n0 - Exit\n\n");
}
void one() {
    stu t;
    printf("Please enter the SID, CID, name and four scores. Enter 0 to finish.\n");
    while (cin >> t.SID && t.SID != "0") {
        cin >> t.CID >> t.name >> t.sub_grade[0] >> t.sub_grade[1] >> t.sub_grade[2] >> t.sub_grade[3];
        if (vis[t.SID])  printf("Duplicated SID.\n");
        else {
            vis[t.SID] = 1;
            add_del(t, 1);
            student.push_back(t);
        }
        printf("Please enter the SID, CID, name and four scores. Enter 0 to finish.\n");
    }
}
void two() {
    string s; 
    printf("Please enter SID or name. Enter 0 to finish.\n");
    while (cin >> s && s != "0") {
        int cnt = 0;
        auto it = student.begin();
        while (it != student.end())
            if (it->SID == s || it->name == s) {
                vis[it->SID] = 0;
                add_del(*it, -1);
                ++cnt;
                it = student.erase(it);
            }
            else
                ++it;
        printf("%d student(s) removed.\nPlease enter SID or name. Enter 0 to finish.\n",cnt);
    }
}
void three() {
    string s; int cnt = 0;
    printf("Please enter SID or name. Enter 0 to finish.\n");
    while (cin >> s && s != "0") {
        auto it = student.begin();
        while (it != student.end())
            if (it->SID == s || it->name == s) {
                printf("%d %s %d %s %d %d %d %d %d %.2lf\n", rak[it->sub_grade[4]], it->SID.c_str(), it->CID, it->name.c_str(), it->sub_grade[0],
                    it->sub_grade[1], it->sub_grade[2], it->sub_grade[3],it->sub_grade[4],it->sub_grade[4]/4.0+ EPS);
                ++it;
            }
            else
                ++it;
        printf("Please enter SID or name. Enter 0 to finish.\n");
    }

}
void four() {
    printf("Showing the ranklist hurts students' self-esteem. Don't do that.\n");
}
void five() {
    printf("Please enter class ID, 0 for the whole statistics.\n");
    int nn;
    cin >> nn;
    for (int i = 0; i < 4; ++i)
        printf("%s\nAverage Score: %.2lf\nNumber of passed students: %d\nNumber of failed students: %d\n\n",
            subj[i].c_str(),1.0*all[nn].grade[i]/max(1,all[nn].all_num)+EPS,all[nn].pass_num[i],all[nn].all_num- all[nn].pass_num[i]);
    printf("Overall:\nNumber of students who passed all subjects: %d\nNumber of students who passed 3 or more subjects: %d\nNumber of students who passed 2 or more subjects: %d\nNumber of students who passed 1 or more subjects: %d\nNumber of students who failed all subjects: %d\n\n",
        all[nn].p[4], all[nn].p[3]+ all[nn].p[4], all[nn].p[2]+ all[nn].p[3] + all[nn].p[4], all[nn].p[1]+ all[nn].p[2] + all[nn].p[3] + all[nn].p[4], all[nn].p[0]);
}
int main() {
#ifdef _DEBUG
    freopen("in", "rb", stdin);
#endif // _DEBUG    
    for (int i = 0; i <= 400; ++i)
        rak[i] = 1;
    memset(all, 0, sizeof(all));//全归0
    int n;
    while (1) {
        Print_menu();
        cin >> n;
        switch (n)
        {
        case 0: return 0;
            break;
        case 1: one();
            break;
        case 2: two();
            break;
        case 3: three();
            break;
        case 4: four();
            break;
        case 5: five();
            break;
        default:
            break;
        }
    }
}

习题4-1
https://vjudge.net/problem/UVA-1589
注意将吃掉红旗的情况

#include<iostream>
#include<string>
#include<cstring>
#pragma warning(disable:4996)
using namespace std;
struct node {
    string f;
    int r, c;
};
node all[10];
int vis[15][15] = {};
int jiang[15][15] = {};
int N, r, c;
int main() {
    for (int i = 1; i <= 9; ++i)
        vis[0][i] = vis[11][i] = 1;
    for (int i = 1; i <= 10; ++i)
        vis[i][0] = vis[i][10] = 1;
    for (int i = 4; i <= 6; ++i)
        jiang[0][i] = jiang[4][i] = 1;
    for (int i = 1; i <= 3; ++i)
        jiang[i][3] = jiang[i][7] = 1;
#ifdef _DEBUG
    freopen("in", "rb", stdin);
#endif // _DEBUG    
    while (cin >> N >> r >> c && (N || r || c)) {
        for (int i = 1; i <= 10; ++i)
            for (int j = 1; j <= 9; ++j)
                vis[i][j] = 0;
        for (int i = 1; i <= 3; ++i)
            for (int j = 4; j <= 6; ++j)
                jiang[i][j] = 0;
        for (int i = 0; i < N; ++i) {
            cin >> all[i].f >> all[i].r >> all[i].c;
            vis[all[i].r][all[i].c] = 1;
        }
        int x, y;
        bool win = true;
        for (int i = 0; i < N; ++i) {
            x = all[i].r, y = all[i].c;
            switch (all[i].f[0])
            {
            case 'R':
                while ((jiang[++x][y] = 1) && !vis[x][y]);
                x = all[i].r;
                while ((jiang[--x][y] = 1) && !vis[x][y]);
                x = all[i].r;
                while ((jiang[x][++y] = 1) && !vis[x][y]);
                y = all[i].c;
                while ((jiang[x][--y] = 1) && !vis[x][y]);
                break;
            case 'H':
                if (!vis[x + 1][y]) {
                    if (x + 2 < 11 && y - 1 > 0) jiang[x + 2][y - 1] = 1;
                    if (x + 2 < 11 && y + 1 < 10) jiang[x + 2][y + 1] = 1;
                }
                if (!vis[x - 1][y]) {
                    if (x - 2 > 0 && y - 1 > 0) jiang[x - 2][y - 1] = 1;
                    if (x - 2 > 0 && y + 1 < 10) jiang[x - 2][y + 1] = 1;
                }
                if (!vis[x][y + 1]) {
                    if (y + 2 < 10 && x - 1 > 0) jiang[x - 1][y + 2] = 1;
                    if (y + 2 < 10 && x + 1 < 11) jiang[x + 1][y + 2] = 1;
                }
                if (!vis[x][y - 1]) {
                    if (y - 2 > 0 && x - 1 > 0) jiang[x - 1][y - 2] = 1;
                    if (y - 2 > 0 && x + 1 < 11) jiang[x + 1][y - 2] = 1;
                }
                break;
            case 'C':
                while (!vis[++x][y]);
                if (x < 10) 
                    while ((jiang[++x][y] = 1)&&!vis[x][y]) ;
                x = all[i].r;
                while (!vis[--x][y]);
                if (x > 1) 
                    while ((jiang[--x][y] = 1)&&!vis[x][y]) ;
                x = all[i].r;
                while (!vis[x][++y]);
                if (y < 9) while 
                    ((jiang[x][++y] = 1)&&!vis[x][y]) ;
                y = all[i].c;
                while (!vis[x][--y]);
                if (y > 1) 
                    while ((jiang[x][--y] = 1)&&!vis[x][y]) ;
                break;
            case 'G':
                while ((jiang[--x][y]=1) && !vis[x][y])
                    if (x == r && y == c) win = false;
                break;
            default:
                break;
            }
        }
        if (!jiang[r + 1][c]) win = false;
        if (!jiang[r - 1][c]) win = false;
        if (!jiang[r][c + 1]) win = false;
        if (!jiang[r][c - 1]) win = false;
        if (win) printf("YES\n");
        else printf("NO\n");
    }
}

习题4-2
https://vjudge.net/problem/UVA-201

#include<iostream>
#include<string>
#include<cstring>
#pragma warning(disable:4996)
using namespace std;
int main() {
#ifdef _DEBUG
    freopen("in", "rb", stdin);
#endif // _DEBUG    
    int N, M, cnt = 0;
    while (cin >> N >> M) {
        int H[10][10] = {}, V[10][10] = {};
        if (++cnt != 1)printf("\n**********************************\n\n");
        printf("Problem #%d\n\n", cnt);
        while (M--) {
            string s; int a, b;
            cin >> s >> a >> b;
            switch (s[0])
            {
            case 'H':H[a][b] = 1;
                break;
            case 'V':V[b][a] = 1;
                break;
            default:
                break;
            }
        }
        bool flag = true;//是否没有正方形
        for (int k = 1; k <= N-1; ++k) {//k为边长
            int nn = 0;//边长为k的正方形个数
            for (int i = 1; i + k <= N; ++i) {
                for (int j = 1; j + k  <= N; ++j) {
                    bool is_z = true;
                    for (int x = 0; x < k; ++x)
                        if (!(H[i][j + x] && H[i + k][j + x] && V[i + x][j] && V[i + x][j + k])) {
                            is_z = false; break;
                        }
                    if (is_z) ++nn;
                }
            }
            if (nn) {
                flag = false;
                printf("%d square (s) of size %d\n", nn, k);
            }
        }
        if (flag) printf("No completed squares can be found.\n");
    }

}

习题4-3
https://vjudge.net/problem/UVA-220

#include<iostream>
#include<string>
#include<cstring>
#pragma warning(disable:4996)
using namespace std;
string s[9];
int turn;
int Qi_n[2];
char Qi[2] = {'B','W'};
bool is_true(int r,int c,int flag,int x,int y) {//(x,y)是方向向量 flag=0时查询,1时实际操作
    int k = 1;
    if (r + k * x > 7 || r + k * x < 0 || c + k * y>7 || c + k * y <0 || s[r + x][c + y] != Qi[1 - turn]) return false;
    for (k = 2; k < 8; ++k) {
        if (r + k*x > 7 || r + k*x < 0 || c + k*y>7 || c + k*y <0 || s[r + k*x][c + k*y] == '-') return false;
        if (s[r + k * x][c + k * y] == Qi[turn]) break;
    }
    if (flag) {
        for (int k = 1; k < 8; ++k) {
            if (s[r + k * x][c + k * y] == Qi[turn]) break;
            s[r + k * x][c + k * y] = Qi[turn];
            ++Qi_n[turn];
            --Qi_n[1 - turn];
        }
    }
    return true;
}
//判断是否可以落子到(r,c)
bool del_IQ(int r, int c, int flag) {
    bool is_ok = false;
    for (int x = -1; x < 2; ++x)
        for (int y = -1; y < 2; ++y)
            if (x || y)
                if (is_true(r, c, flag, x, y))
                    is_ok = true;
    if (flag && is_ok) {
        s[r][c] = Qi[turn];
        ++Qi_n[turn];
    }
    return is_ok;
}
int main() {
#ifdef _DEBUG
    freopen("in", "rb", stdin);
    freopen("out", "wb", stdout);
#endif // _DEBUG    
    int N;
    cin >> N;
    for (int i = 0; i < N;++i) {
        if (i) cout << endl;
        for (int i = 0; i < 8; ++i)
            cin >> s[i];
        Qi_n[0] = Qi_n[1] = 0;
        for (int i = 0; i < 8; ++i)
            for (int j = 0; j < 8; ++j)
                if (s[i][j] == 'B') ++Qi_n[0];
                else if (s[i][j] == 'W') ++Qi_n[1];
        string str;
        cin >> str;
        if (str[0] == 'B') turn = 0;
        else turn = 1;
        while (cin >> str) {
            if (str == "Q") {
                for (int i = 0; i < 8; ++i)
                    cout<< s[i]<<endl;
                break;
            }
            if (str == "L") {
                int cnt = 0;
                for (int i = 0; i < 8; ++i) {
                    for (int j = 0; j < 8; ++j)
                        if (s[i][j] == '-' && del_IQ(i, j, 0))
                            if (cnt++) printf(" (%d,%d)", i+1, j+1);
                            else  printf("(%d,%d)", i+1, j+1);
                }
                if (!cnt) printf("No legal move.");
                printf("\n");
            }
            else {//str==Mrc
                int r=str[1]-'0'-1, c=str[2]-'0'-1;
                if(!del_IQ(r, c, 0)) turn = 1 - turn;
                del_IQ(r, c, 1); turn = 1 - turn;
                printf("Black - %2d White - %2d\n", Qi_n[0], Qi_n[1]);
            }
        }
    }
}

习题4-4
https://vjudge.net/problem/UVA-253

#include<iostream>
#include<string>
#include<cstring>
#pragma warning(disable:4996)
using namespace std;

int main() {
#ifdef _DEBUG
    //freopen("in", "rb", stdin);
    //freopen("out", "wb", stdout);
#endif // _DEBUG    
    string A[24] = { "123456","135246","154326","142536",
                    "214365","246135","263415","231645",
                    "312564","326154","365214","351624",
                    "421653","415263","456123","462513",
                    "513462","536142","564312","541632",
                    "624351","645231","653421","632541" };
    string s, t;
    while (cin >> s) {
        bool is_true=false;
        t = string(s, 0, 6);
        s = string(s, 6, 12);
        for (int i = 0; i < 24; ++i) {
            is_true = true;
            for(int j=0;j<6;++j)
                if (t[j] != s[A[i][j] - '1']) {
                    is_true = false; break;
                }
            if (is_true) break;
        }
        if (is_true) cout << "TRUE" << endl;
        else cout << "FALSE" << endl;
    }
}

习题4-5
https://vjudge.net/problem/UVA-1590

#include<iostream>
#include<string>
#include<sstream>
#include<bitset>
#include<cstring>
#pragma warning(disable:4996)
using namespace std;
void P(string s) {
    bitset<8> bint;
    stringstream S(string(s, 0,8));
    S >> bint;
    cout << bint.to_ulong();
    S.str(string(s, 8, 8));
    S >> bint;
    cout <<"."<< bint.to_ulong();
    S.str(string(s, 16, 8));
    S >> bint;
    cout << "." << bint.to_ulong();
    S.str(string(s, 24, 8));
    S >> bint;
    cout << "." << bint.to_ulong() <<endl;
}
int main() {
#ifdef _DEBUG
    //freopen("in", "rb", stdin);
    //freopen("out", "wb", stdout);
#endif // _DEBUG

    int n;
    while (cin >> n) {
        string s;
        string sta[1002];
        int top = -1;
        while (n--) {
            cin >> s;
            for (int i = 0; i < s.size(); ++i)
                if (s[i] == '.') s[i] = ' ';
            int a[4];
            sscanf(s.c_str(), "%d %d %d %d", a, a + 1, a + 2, a + 3);
            s = "";
            for (int i = 0; i < 4; ++i) {
                bitset<8> bs(a[i]);
                stringstream S;
                S << bs;
                s += string(8 - S.str().size(), '0') + S.str();
            }
            sta[++top] = s;
        }
        int i = 0;
        bool _end = false;
        for (; i < 32; ++i) {
            for (int j = 1; j <= top; ++j)
                if (sta[j][i] != sta[0][i]) {
                    _end = true; break;
                }
            if (_end) break;
        }
        s = string(i, '1') + string(32 - i, '0');
        for (; i < 32; ++i)
            sta[0][i] = '0';
        P(sta[0]);
        P(s);
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值