【杭电多校训练记录】 2025"钉耙编程"中国大学生算法设计春季联赛(2)

训练情况

赛后反思

赛后VP打的,挺乐的签到题字符串复制错了,导致WA了一发

1002

我们将题目所给的天干地支存到数组里,1984年对应的数组 \(a_1,b_1\),开两个指针一直循环到2043年,处理一下后继的头尾相接,用map记录一下字符串对应的年份的映射关系

点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'

using namespace std;

string a[13] = {"","jia","yi","bing","ding","wu","ji","geng","xin","ren","gui"};
string b[13] = {"","zi","chou","yin","mao","chen","si","wu","wei","shen","you","xu","hai"};

map<string,int> ans;

void pre(){
    int now = 1984;
    int pos1 = 1,pos2 = 1;
    while(now<=2043){
        ans[a[pos1] + b[pos2]] = now;
        pos1++,pos2++;
        if(pos1 > 10) pos1 = 1;
        if(pos2 > 12) pos2 = 1;
        now++;
    }
}

void solve(){
    string s; cin>>s;
    cout<<ans[s]<<endl;
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
    pre();
    int T; cin>>T; while(T--)
    solve();
    return 0;
}

1004

最长上升子序列,我们首先观察到字符串只有小写字母,其次是 \(k\) 巨大无比,但是我们显然观察到最多拼接 \(26\) 次即可,因为小写字母只有 \(26\) 个,能拼接出最长上升子序列长度最大值只能是 \(26\),所以我们 \(k\)\(\min(k,26)\) 即可,再拼接字符串跑 \(n^2\) 的最长上升子序列即可,\(dp_i\) 表示第 \(i\) 位结束的最长上升子序列的长度,可以从 \(j(j<i)\) 如果前面的字符小于当前字符转移答案即可,\(dp_i = \max(dp_i,dp_j + 1)\)

点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'

using namespace std;

void solve(){
    string base,t; cin>>base>>t;
    int k;
    if(t.size() > 2) k = 26;
    else if(t.size() == 1) k = t[0] - '0';
    else k = min(26,(t[0] - '0') * 10 + (t[1] - '0'));
    string s;
    for(int i = 1;i<=k;i++) s+=base;
    int n = s.size();
    vector<int> dp(n + 1,1);
    for(int i = 0;i<n;i++){
        for(int j = 0;j<i;j++){
            if(s[j] < s[i]) dp[i] = max(dp[i],dp[j] + 1);
        }
    }
    int ans = 0;
    for(int i = 0;i<n;i++) ans = max(ans,dp[i]);
    cout<<ans<<endl;
}

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
    int T; cin>>T; while(T--)
    solve();
    return 0;
}

posted @ 2025-03-18 17:00  MNNUACM_2024ZY  阅读(63)  评论(0)    收藏  举报