AtCoder ABC 244(A ~ E F待补)

这篇博客探讨了如何通过图论和动态规划算法解决寻找特定条件下具有奇数个数X的最短路径问题。具体涉及KingBombee游戏和ShortestGoodPath的解决方案,讲解了如何进行记忆化搜索和状态转移,帮助读者理解如何在实际问题中应用这些高级算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AtCoder ABC 244

A - Last Letter(语法)

Description:

​ 输出给定字符串的最后一个字符

Resolution

​ 过水

Code:

void solve()
{
	int n;
    string s;
    cin >> n;
    cin >> s;
    cout << s[n - 1];
}

B - Go Straight and Turn Right(模拟)

Description:

​ 对于给定操作序列 S向前走一步 R顺时针转向 初始坐标是0 0 输出操作序列结束时的坐标

Resolution

​ 写出方向偏移量 然后模拟 注意的是使转向环形进行

Code:

int dx[4][2] = {{1, 0}, {0, -1}, {-1, 0}, {0, 1}}; //0 1 2 3
char s[100010];
 
void solve()
{
	int n;
    cin >> n;
    cin >> s;
    int st = 0;
    PII res = {0, 0};
    for(int i = 0; i < n; i++)
    {
        if(s[i] == 'S')     res.first += dx[st][0], res.second += dx[st][1];
        else if(s[i] == 'R')  st = (st == 3) ? 0 : st + 1;
    }
    cout << res.first << " " << res.second;
}

C - Yamanote Line Game(交互 + 简单模拟)

Description:

​ 首先 A会给你一个数n 然后B和A交替输出一个[1, 2 * n + 1]之间未被输出过的数

​ 最后一个没有数输出的人 只能输出0

​ 题目告诉你 B 一定获胜 所以请你模拟B的输出 来完成这个game (A是一个编写好的程序 他会随机应变)

​ 切记 当最后A输出0之后要记得return 0 不然会TLE

Resolution

​ 读题卡了好久 应该抓住重点确定 比如循环次数的次数

​ 因为2 * n + 1是奇数 又因为B先输出 所以B一定能获胜

​ 策略:B每次直接找[1, 2 * n + 1]中没有被输出的数输出即可

Code:

bool st[1010];
 
void solve()
{
	int n, x;
    cin >> n;
    cout << 1 << '\n';
    st[1] = 1;
    
    for(int i = 1; i <= n + 1; i++)
    {
        cin >> x;
        if(x == 0)  return;
 
        st[x] = 1;
        for(int i = 1; i <= 2 * n + 1; i++)
        {
            if(st[i] == false)
            {
                st[i] = 1;
                cout << i << '\n';
                break;
            }
        }
    }
}

D - Swap Hats(思维)

Description:

​ 给定3个字母R G B组成的序列为标准排列

​ 再给定3个字母R G B组成的序列为当前排列

​ 请问是否能够经过1e18的交换次数使当前排列恢复成标准排列 交换可以任意位置互换

Resolution

​ 简化问题为 经过偶数次排序能还原的都没问题 经过奇数次还原的不行

​ 想到这里就很容易实现了

Code:

void solve()
{
    char c;
	for(int i = 0; i < 3; i++)
    {
        cin >> c;
        mp[c] = i;
    }
 
    int res = 0;
    for(int i = 0; i < 3; i++)
    {
        cin >> c;
        if(i != mp[c])     res ++;
    }
    if(res == 2)    puts("No"); //奇数次交换
    else puts("Yes");
}

E - King Bombee(图论 + DP)

Description:

​ 给出一张无向图 请问起点为编号s 终点为编号t 且长度为len 含有奇数个数个X的路径有多少个

Resolution

​ 可以想到计数DP的思路 然后用记忆化搜索 根据题意爆搜就可以过了

Code:

const int mod = 998244353;
int n, m, k, s, t, x;
vector<int> edge[2010];
int dp[2010][2010][2]; //长度 当前节点 X出现次数奇偶
 
int dfs(int step, int u, int is_even) //长度 当前节点 是奇数1 偶数0
{
    if(step == k)   return u == t && is_even; //满足条件就返回1
    if(dp[step][u][is_even] != -1)   return dp[step][u][is_even]; //记忆化搜索
    int res = 0;
    
    for(auto v : edge[u])
        res = (res + dfs(step + 1, v, is_even ^ (v == x))) % mod; //0 变 1 1 变 0 
        
    dp[step][u][is_even] = res;
    return res;
}
 
void solve()
{
    cin >> n >> m >> k >> s >> t >> x;
    for(int i = 1; i <= m; i++)
    {
        int u, v;
        cin >> u >> v; //无向图
        edge[u].push_back(v);
        edge[v].push_back(u);
    }
 
    memset(dp, -1, sizeof dp);
    cout << dfs(0, s, 1) << '\n';
}

F - Shortest Good Path

Description:

Resolution

Code:

### AtCoder编程题库概述 AtCoder是一个面向全球程序员的在线竞赛平台,提供多种难度级别的比赛和练习题目。对于希望提升算法能力的学习者来说,AtCoder提供了丰富的资源来满足不同层次的需求。 #### 初学者友好型赛事——Beginner Contest系列 针对初学者设计的比赛称为“Beginner Contest”,简称ABC[^1]。这类比赛通常包含若干道由易到难排列的任务,适合那些刚开始接触算法竞赛的人群参与并学习。每场比赛都会设置A至E/F等级别的挑战项目,其中: - A/B类问题较为基础,主要考察基本语法理解和简单逻辑思考; - C/D类则会涉及到一些常见的数据结构或经典算法的应用; - 而E/F级别往往需要更深入的理解以及创造性解决问题的能力[^2]。 #### 数学推理与组合数专题训练 除了常规赛外,还有专门围绕特定知识点展开的主题活动。例如,在一次比赛中出现了关于数学推理加组合数计算的问题(E级),这不仅考验选手们对离散数学概念掌握程度,同时也检验其能否灵活运用这些理论解决实际编码难题[^3]。 #### 进阶挑战——F级别高难度试题解析 随着技能水平提高,可以尝试更高难度的F级别题目。此类问题可能涉及复杂的数据处理技巧或是新颖独特的解法思路。通过研究过往优秀参赛者的解答案例(ABCF205),能够帮助加深理解,并启发新的思维方式去应对更加棘手的技术挑战[^4]。 ```python # Python 示例代码用于求解某个具体问题(假设为斐波那契序列) def fibonacci(n): if n <= 0: return 0 elif n == 1: return 1 else: a, b = 0, 1 for _ in range(2, n + 1): a, b = b, a + b return b ``` 为了更好地利用AtCoder进行有效率地刷题练习,建议先从简单的Beginner Contest入手,逐步积累经验后再向更具挑战性的领域迈进。同时也要注重总结归纳常见模式和技术要点,这样才能不断提高自己的竞争力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值