KAJIMA CORPORATION CONTEST 2025 (AtCoder Beginner Contest 394)
A - 22222
题意
给定字符串\(s\),删除所有除\(2\)的字符
思路
模拟
代码
点击查看代码
#include<bits/stdc++.h>
#include<unordered_set>
#include<unordered_map>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int mxn = 2e5 + 10;
void solve()
{
string s;
cin >> s;
for (int i = 0; i < s.length(); i++)
{
if (s[i] != '2')
{
continue;
}
cout << s[i];
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int __ = 1;
//cin >> __;
while (__--)
{
solve();
}
return 0;
}
B - cat
题意
给定\(n\)个字符串,将这些字符串按字典序排序后拼接成一个字符串
思路
模拟
代码
点击查看代码
#include<bits/stdc++.h>
#include<unordered_set>
#include<unordered_map>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int mxn = 2e5 + 10;
bool cmp(string& a, string& b)
{
if (a.size() == b.size())
{
return a < b;
}
return a.size() < b.size();
}
void solve()
{
int n;
cin >> n;
vector<string> a(n);
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
sort(a.begin(), a.end(), cmp);
for (int i = 0; i < n; i++)
{
cout << a[i];
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int __ = 1;
//cin >> __;
while (__--)
{
solve();
}
return 0;
}
C - Debug
题意
给定字符串\(s\),每次把最左边的\(WA\)改成\(AC\)
思路
模拟
代码
点击查看代码
#include<bits/stdc++.h>
#include<unordered_set>
#include<unordered_map>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int mxn = 2e5 + 10;
void solve()
{
string s;
cin >> s;
int now = 0;
while (now < (int)s.size() - 1)
{
if (s[now] == 'W' && s[now + 1] == 'A')
{
s[now] = 'A';
s[now + 1] = 'C';
now = max(now - 1, 0LL);
}
else
{
now++;
}
}
cout << s << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int __ = 1;
//cin >> __;
while (__--)
{
solve();
}
return 0;
}
D - Colorful Bracket Sequence
题意
思路
栈的应用
代码
点击查看代码
#include<bits/stdc++.h>
#include<unordered_set>
#include<unordered_map>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int mxn = 2e5 + 10;
void solve()
{
string s;
cin >> s;
stack<char> st;
for (int i = 0; i < s.length(); i++)
{
if (!st.empty())
{
char last = st.top();
if (last == '(' && s[i] == ')' || last == '<' && s[i] == '>' || last == '[' && s[i] == ']')
{
st.pop();
}
else
{
st.push(s[i]);
}
}
else
{
st.push(s[i]);
}
}
cout << (st.empty() ? "Yes" : "No") << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int __ = 1;
//cin >> __;
while (__--)
{
solve();
}
return 0;
}
E - Palindromic Shortest Path
题意
给定\(n\)个顶点的有向图,边的信息由\(n×n\)的矩阵\(a\)提供:对于\(a_{i,j}\),“-”代表没有边,其他表示\(i\)到\(j\)有一条有一条标为\(a_{i,j}\)的边
对于\((i,j)\),从\(i\)到\(j\)的所有路径(不一定是简单路径)中,如果边上的标签连起来构成一个回文,那么最短路径的长度是多少?没有则是\(-1\)
思路
从起点\(u\)和终点\(v\)分别出发,若路径上有奇数个点,则最终汇合在一个点上,即\((i,i)\);若有偶数个点,则汇合在一对有边连接的点上,即\({i,j}\)且\(i,j\)之间有边。则我们可以对每个\((i,i)\)和\((i,j)\)分别向\((u,v)\)扩展,取最短路径。详情见代码
代码
点击查看代码
#include<bits/stdc++.h>
#include<unordered_set>
#include<unordered_map>
using namespace std;
#define int long long
typedef pair<int, int> pii;
typedef pair<int, char> pic;
const int mxn = 2e5 + 10;
char a[105][105];
int dis[105][105];
void solve()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
memset(dis, -1, sizeof(dis));
queue<pii> q;
for (int i = 0; i < n; i++)
{
dis[i][i] = 0;
q.push({ i,i });
for (int j = 0; j < n; j++)
{
if (i == j || a[i][j] == '-')
{
continue;
}
dis[i][j] = 1;
q.push({ i,j });
}
}
while (q.size())
{
auto [u, v] = q.front();
q.pop();
// 对于(u,v)
for (int i = 0; i < n; i++)
{
// 是否存在 i 与 u 相连
if (a[i][u] == '-')
{
continue;
}
for (int j = 0; j < n; j++)
{
// 是否存在 j 与 v 相连, 且二者要相同(构成回文)
if (a[v][j] == '-' || a[i][u] != a[v][j])
{
continue;
}
if (dis[i][j] == -1 || dis[i][j] > dis[u][v] + 2) // 每次多了(i,j)所以是+2
{
dis[i][j] = dis[u][v] + 2;
q.push({ i,j });
}
}
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cout << dis[i][j] << " ";
}
cout << endl;
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int __ = 1;
//cin >> __;
while (__--)
{
solve();
}
return 0;
}
F - Alkane
题意
给定大小为\(n\)的无向树,找出满足下列条件的结点数最大的子图:图是无向树、每个顶点的度数为\(1\)或\(4\)且至少有一个顶点的度数为\(4\)
思路
选出“主干”,即度数不小于\(4\)的点连成的最长链,长度记为\(m\),则答案就是\(3m+2\)
代码
点击查看代码
#include<bits/stdc++.h>
#include<unordered_set>
#include<unordered_map>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int mxn = 2e5 + 10;
int ans = -1;
vector<int> g[mxn];
bool vis[mxn];
int dp[mxn][2]; // dp[i][0]表示 i 作为“主干”端点的子图最大顶点数,dp[i][1]表示 i 作为“主干”中间点的子图最大顶点数
void dfs(int u)
{
vis[u] = true;
vector<int> t;
for (auto& v : g[u])
{
if (!vis[v] && (int)g[v].size() >= 4)
{
dfs(v);
t.push_back(dp[v][1]);
}
}
sort(t.begin(), t.end(), greater<>());
// 作中间点
dp[u][1] = accumulate(t.begin(), t.begin() + min(3LL, (int)t.size()), 1LL); // 最大的3个孩子
// 作端点
dp[u][0] = dp[u][1] + ((int)t.size() > 3 ? t[3] : 0);
ans = max(ans, dp[u][0]);
}
void solve()
{
int n;
cin >> n;
for (int i = 0; i < n - 1; i++)
{
int u, v;
cin >> u >> v;
u--, v--;
g[u].push_back(v);
g[v].push_back(u);
}
if (n < 5)
{
cout << -1 << endl;
return;
}
for (int i = 0; i < n; i++)
{
if (!vis[i] && (int)g[i].size() >= 4)
{
dfs(i);
}
}
cout << 3 * ans + 2 << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int __ = 1;
//cin >> __;
while (__--)
{
solve();
}
return 0;
}


浙公网安备 33010602011771号