【杭电多校训练记录】 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;
}

浙公网安备 33010602011771号