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提供:对于ai,j,“-”代表没有边,其他表示ij有一条有一条标为ai,j的边
对于(i,j),从ij的所有路径(不一定是简单路径)中,如果边上的标签连起来构成一个回文,那么最短路径的长度是多少?没有则是1

思路#

从起点u和终点v分别出发,若路径上有奇数个点,则最终汇合在一个点上,即(i,i);若有偶数个点,则汇合在一对有边连接的点上,即i,ji,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的无向树,找出满足下列条件的结点数最大的子图:图是无向树、每个顶点的度数为14且至少有一个顶点的度数为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;
}


比赛链接 https://atcoder.jp/contests/abc394

posted @   _SeiI  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示