KAJIMA CORPORATION CONTEST 2025 (AtCoder Beginner Contest 394)
A - 22222#
题意#
给定字符串
,删除所有除 的字符
思路#
模拟
代码#
点击查看代码
#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#
题意#
给定
个字符串,将这些字符串按字典序排序后拼接成一个字符串
思路#
模拟
代码#
点击查看代码
#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#
题意#
给定字符串
,每次把最左边的 改成
思路#
模拟
代码#
点击查看代码
#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#
题意#
给定
个顶点的有向图,边的信息由 的矩阵 提供:对于 ,“-”代表没有边,其他表示 到 有一条有一条标为 的边
对于,从 到 的所有路径(不一定是简单路径)中,如果边上的标签连起来构成一个回文,那么最短路径的长度是多少?没有则是
思路#
从起点
和终点 分别出发,若路径上有奇数个点,则最终汇合在一个点上,即 ;若有偶数个点,则汇合在一对有边连接的点上,即 且 之间有边。则我们可以对每个 和 分别向 扩展,取最短路径。详情见代码
代码#
点击查看代码
#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#
题意#
给定大小为
的无向树,找出满足下列条件的结点数最大的子图:图是无向树、每个顶点的度数为 或 且至少有一个顶点的度数为
思路#
选出“主干”,即度数不小于
的点连成的最长链,长度记为 ,则答案就是
代码#
点击查看代码
#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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具