2021年团体程序设计天梯赛-题解

本文档包含一系列编程题目及解答,主要涉及C++语言,包括整数操作、字符串处理、数组操作、队列应用、图的遍历、最值问题、链表操作等算法。通过对这些代码的阅读和理解,读者可以提升对算法和数据结构的应用能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题面暂无
先给出代码,题解稍后补充

附上成绩
在这里插入图片描述

L1-1

print('To iterate is human, to recurse divine.')

L1-2

#include <bits/stdc++.h>
using namespace std;
int n;
int k, m;
int main() {
    scanf("%d", &n);
    scanf("%d%d", &k, &m);
    int ans = n - k * m;
    printf("%d\n", ans);
    return 0;
}

L1-3

#include <bits/stdc++.h>
using namespace std;
string s;
int main() {
    cin >> s;
    if (s.length() == 4) {
        if (s.substr(0, 2) < "22") {
            cout << "20" << s.substr(0, 2) << "-" << s.substr(2, 2) << endl;
        } else {
            cout << "19" << s.substr(0, 2) << "-" << s.substr(2, 2) << endl;
        }
    } else {
        cout << s.substr(0, 4) << "-" << s.substr(4, 2) << endl;
    }
    return 0;
}

L1-4

#include <bits/stdc++.h>
using namespace std;
int n, m;
double p;
int main() {
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; ++i) {
        scanf("%lf", &p);
        if (p < m) {
            printf("On Sale! %.1lf\n", p);
        }
    }
    return 0;
}

L1-5

#include <bits/stdc++.h>
#define N 24
using namespace std;
int a[N], op;
int main() {
    for (int i = 0; i < N; ++i) {
        scanf("%d", &a[i]);
    }
    while (~scanf("%d", &op) && op >= 0 && op <= 23) {
        if (a[op] > 50) {
            printf("%d Yes\n", a[op]);
        } else {
            printf("%d No\n", a[op]);
        }
    }
    return 0;
}

L1-6

#include <bits/stdc++.h>
#define N 31
using namespace std;
int n, m, pos;
string tim[N];
bool qiandao[N];
int main() {
    scanf("%d%d", &n, &m);
    getchar();
    for (int i = 0; i < n; ++i) {
        getline(cin, tim[i]);
        int len = tim[i].length();
        for (int j = 0; j < len; ++j) {
            if (tim[i].substr(j, 7) == "qiandao" ||
                tim[i].substr(j, 4) == "easy") {
                qiandao[i] = true;
                break;
            }
        }
    }
    while (pos < n && m) {
        if (!qiandao[pos]) {
            --m;
        }
        ++pos;
    }
    while (qiandao[pos]) {
        ++pos;
    }
    if (pos == n) {
        printf("Wo AK le\n");
    } else {
        cout << tim[pos] << endl;
    }
    return 0;
}

L1-7

#include <bits/stdc++.h>
#define N 20004
using namespace std;
int n;
int a[N];
int minn = 1e8, cnt1;
int maxx = -1, cnt2;
int main() {
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) {
        scanf("%d", &a[i]);
        if (a[i] <= minn) {
            if (a[i] < minn) {
                minn = a[i];
                cnt1 = 0;
            }
            ++cnt1;
        }
        if (a[i] >= maxx) {
            if (a[i] > maxx) {
                maxx = a[i];
                cnt2 = 0;
            }
            ++cnt2;
        }
    }
    printf("%d %d\n", minn, cnt1);
    printf("%d %d\n", maxx, cnt2);
    return 0;
}

L1-8

#include <bits/stdc++.h>
#define N 2003
using namespace std;
int n, a[N], p = 3;
int main() {
    scanf("%d%d", &a[1], &a[2]);
    scanf("%d", &n);
    for (int i = 1; i <= n && p <= n; ++i) {
        int tmp = a[i] * a[i + 1];
        if (tmp >= 10) {
            a[p++] = tmp / 10;
            a[p++] = tmp % 10;
        } else {
            a[p++] = tmp;
        }
    }
    for (int i = 1; i <= n; ++i) {
        printf(" %d" + !(i - 1), a[i]);
    }
    printf("\n");
    return 0;
}

L2-1

#include <bits/stdc++.h>
#define N 102
#define M 1003
using namespace std;
int n, m, smax, op;
char g[N][M];
string kuang, ans;
int cnt[N];
int main() {
    scanf("%d%d%d", &n, &m, &smax);
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            scanf(" %c", &g[i][j]);
        }
    }
    while (~scanf("%d", &op) && op != -1) {
        if (op == 0) {
            if (cnt[0]) {
                ans += kuang[--cnt[0]];
            }
        } else {
            if (cnt[op] < m) {
                if (cnt[0] == smax) {
                    ans += kuang[--cnt[0]];
                }
                if (cnt[0] < kuang.length()) {
                    kuang[cnt[0]] = g[op][++cnt[op]];
                } else {
                    kuang += g[op][++cnt[op]];
                }
                cnt[0]++;
            }
        }
    }
    cout << ans << endl;
    return 0;
}

L2-2

#include <bits/stdc++.h>
#define N 10004
using namespace std;
int n, u;
int in[N], out[N];
struct Edge {
    int v, nxt;
} e[N];
int head[N], cnt;
void addedge(int u, int v) {
    e[++cnt].v = v;
    e[cnt].nxt = head[u];
    head[u] = cnt;
}
struct Node {
    int v, dfn;
    Node() {}
    Node(int _v, int _dfn) : v(_v), dfn(_dfn) {}
    bool operator<(const Node &y) const {
        if (dfn == y.dfn) return v < y.v;
        return dfn > y.dfn;
    }
};
vector<Node> g[N];
int dfn[N];
int s, t;
bool vis[N];
int main() {
    scanf("%d", &n);
    for (int v = 0; v < n; ++v) {
        scanf("%d", &out[v]);
        for (int j = 0; j < out[v]; ++j) {
            scanf("%d", &u);
            ++in[u];
            g[v].push_back(Node(u, 0));
            addedge(u, v);
        }
    }
    queue<int> q;
    for (int i = 0; i < n; ++i) {
        if (!out[i]) {
            q.push(i);
            dfn[i] = 1;
            vis[i] = true;
        }
    }
    while (!q.empty()) {
        u = q.front();
        q.pop();
        for (int i = head[u]; i; i = e[i].nxt) {
            int v = e[i].v;
            dfn[v] = max(dfn[v], dfn[u] + 1);
            if (!vis[v]) {
                q.push(v);
                vis[v] = true;
            }
        }
    }

    for (int i = 0; i < n; ++i) {
        if (in[i] == 0) {
            s = i;
            break;
        }
    }
    cout << dfn[s] << endl;
    cout << s;
    while (g[s].size()) {
        for (int i = 0; i < g[s].size(); ++i) {
            g[s][i].dfn = dfn[g[s][i].v];
        }
        sort(g[s].begin(), g[s].end());
        s = g[s][0].v;
        cout << " " << s;
    }
    cout << endl;
    return 0;
}

L2-3

#include <bits/stdc++.h>
#define N 102
using namespace std;
int n, m;
struct Node {
    int a[N];
    bool operator<(const Node &y) const {
        int p = 1;
        while (p <= m && a[p] == y.a[p]) {
            ++p;
        }
        return a[p] < y.a[p];
    }
};
map<Node, int> mp;
struct ANS {
    int a[N];
    ANS() {}
    ANS(int cnt, const int _a[N]) {
        a[0] = cnt;
        for (int i = 1; i <= m; ++i) {
            a[i] = _a[i];
        }
    }
    bool operator<(const ANS &y) const {
        if (a[0] == y.a[0]) {
            int p = 1;
            while (p <= m && a[p] == y.a[p]) {
                ++p;
            }
            return a[p] < y.a[p];
        }
        return a[0] > y.a[0];
    }
};
vector<ANS> ans;
int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; ++i) {
        Node tmp;
        for (int j = 1; j <= m; ++j) {
            scanf("%d", &tmp.a[j]);
        }
        ++mp[tmp];
    }
    cout << mp.size() << endl;
    for (map<Node, int>::iterator iter = mp.begin(); iter != mp.end(); ++iter) {
        ans.push_back(ANS(iter->second, iter->first.a));
    }
    sort(ans.begin(), ans.end());
    for (int i = 0; i < ans.size(); ++i) {
        cout << ans[i].a[0];
        for (int j = 1; j <= m; ++j) {
            cout << " " << ans[i].a[j];
        }
        cout << endl;
    }
    return 0;
}

L2-4

#include <bits/stdc++.h>
#define N 100005
using namespace std;
int n, m, tmp, op, p = 1;
int k[N], save[102];
vector<int> g[N];
int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; ++i) {
        scanf("%d", &k[i]);
        for (int j = 0; j < k[i]; ++j) {
            scanf("%d", &tmp);
            g[i].push_back(tmp);
        }
    }
    for (int i = 0; i < m; ++i) {
        scanf("%d%d", &op, &tmp);
        if (op == 0) {
            p = g[p][tmp - 1];
        } else if (op == 1) {
            save[tmp] = p;
            printf("%d\n", p);
        } else if (op == 2) {
            p = save[tmp];
        }
    }
    printf("%d\n", p);
    return 0;
}

L3-1

L3-2

#include <bits/stdc++.h>
#define N 100005
using namespace std;
int n, m, tmp;
int cut[N], k[N];
bool vis[N];
vector<int> ct[N];
vector<int> ans(N);
bool dfs(int paper, int num_cut, int now_paper) {
    if (paper == m && num_cut == n) {
        return true;
    }
    bool flag = false;
    for (int i = 1; i <= m; ++i) {
        if (vis[i]) continue;
        bool fuhe = true;
        int j;
        for (j = 0; j < k[i]; ++j) {
            if (cut[num_cut + j] != ct[i][j]) {
                fuhe = false;
                break;
            }
        }
        if (!fuhe) continue;
        vis[i] = true;
        ans[paper] = i;
        flag = dfs(paper + 1, num_cut + k[i] - 1, i);
        if (flag) {
            break;
        }
        vis[i] = false;
    }
    return flag;
}
int main() {
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) {
        scanf("%d", &cut[i]);
    }
    scanf("%d", &m);
    for (int i = 1; i <= m; ++i) {
        scanf("%d", &k[i]);
        for (int j = 0; j < k[i]; ++j) {
            scanf("%d", &tmp);
            ct[i].push_back(tmp);
        }
    }
    dfs(0, 0, 0);
    for (int i = 0; i < m; ++i) {
        printf(" %d" + !i, ans[i]);
    }
    printf("\n");
    return 0;
}

L3-3

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值