当前位置: 首页 > news >正文

AtCoder Beginner Contest 397 A - D题解

Tasks - OMRON Corporation Programming Contest 2025 (AtCoder Beginner Contest 397)


本文为 AtCoder Beginner Contest 397 A - D题解

题目A:

代码(C++):

#include <bits/stdc++.h>

int main() {
    double n;
    std::cin >> n;

    if (n >= 38.0) {
        std::cout << 1;
    } else if (n >= 37.5) {
        std::cout << 2;
    } else {
        std::cout << 3;
    }
}

题目B:  简单贪心,一次遍历

B - Ticket Gate Log

代码(C++):

#include <bits/stdc++.h>

int main() {
    std::string s;
    std::cin >> s;

    int ans = 0;
    bool f = true;
    for (int i = 0; i < s.size(); i++) {
        if (f) {
            if (i % 2 == 0 && s[i] != 'i' || i % 2 == 1 && s[i] != 'o') {
                f = !f;
                ans++;
            }
        } else {
            if (i % 2 == 1 && s[i] != 'i' || i % 2 == 0 && s[i] != 'o') {
                f = !f;
                ans++;
            }
        }
    }

    if ((ans + s.size()) % 2 != 0) {
        ans++;
    }
    std::cout << ans;
}

题目C: 哈希表

C - Variety Split Easy

题目大意:

给你一个数组,把数组分成两个部分,使得数组左边所含有的不同数字个数 + 右边所含有的不同数字个数最大

解题思路:

用两个哈希表mp1, mp2进行模拟即可,mp1先把所有数字添加进去,然后从左到右遍历,mp1减去当前数字,mp2加上当前数字,然后更新答案即可

代码(C++):

#include <bits/stdc++.h>

int main() {
    int n;
    std::cin >> n;

    std::vector<int> a(n);
    std::set<int> st;
    std::map<int, int> mp;
    for (int i = 0; i < n; i++) {
        std::cin >> a[i];
        mp[a[i]]++;
    }

    int ans = 0;

    for (int i = 0; i < n; i++) {
        mp[a[i]]--;
        if (mp[a[i]] == 0) {
            mp.erase(a[i]);
        }
        st.insert(a[i]);
        ans = std::max(ans, int(st.size() + mp.size()));
    }

    std::cout << ans;
}

题目D: 数学推导,枚举优化

题目大意:

给定一个数字n,请你找出两个正整数x, y,满足x * x * x - y * y * y = n

解题思路:

此题我参考jiangly的写法,给出如下详细推导证明:

由上述推导可知,我们可以进行以下枚举:
时间复杂度为O(\sqrt[3]{N}),可以满足题目要求

for (i64 d = 1; d * d * d <= n; d++) {
    
}

现在问题就变成了,如何用这个d和n找出y和x,可以参考下面推导:
​​​、​​​​​

 字写的有点丑,见谅...

代码(C++):

#include <bits/stdc++.h>

using i64 = long long;

int main() {
    i64 n;
    std::cin >> n;

    for (i64 d = 1; d * d * d <= n; d++) {
        if (n % d != 0) {
            continue;
        }
        i64 p = n / d - d * d;
        if (p % 3 != 0) {
            continue;
        }
        p /= 3;

        i64 y = (std::sqrt(d * d + 4 * p) - d) / 2 + 0.5;
        if (y <= 0) {
            continue;
        }
        i64 x = y + d;
        if (__int128(x) * x * x - __int128(y) * y * y == n) {
            std::cout << x << " " << y;
            return 0;
        }
    }

    std::cout << -1;
}

相关文章:

  • 举例说明 牛顿法 Hessian 矩阵
  • python实现简单的图片去水印工具
  • 表单引擎赋能AI:引领未来表单设计新趋势
  • 单片机外设快速入门篇(五)——GPIO篇
  • Houdini :《哪吒2》神话与科技碰撞的创新之旅
  • 【linux】虚拟机执行sudo yum isntall perl报错 could not retrieve mirrorlist htt:
  • 通向AGI的未来之路!首篇2D/视频/3D/4D统一生成框架全景综述(港科大中山等)
  • Elasticsearch使用记录
  • spring动态代理是在生命周期的哪个阶段实现的
  • 矩阵期望 E 的含义:概率
  • 蓝桥杯高频考点——进制转换
  • 【 利用socket来实现简单远控】
  • c++中字符串string常用的函数
  • AMBA-CHI协议详解(二十二)
  • Next-Slides 更新记录
  • AcWing 5960:输出前k大的数 ← 小根堆
  • centos 磁盘重新分割,将原来/home 下部分空间转移到 / 根目录下
  • Idea集成docker通过ca加密实现镜像打包
  • freetros 信号量使用方法实例解析
  • 【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 的自动配置:约定优于配置的设计美学
  • 中国乒协坚决抵制恶意造谣,刘国梁21日将前往多哈参加国际乒联会议
  • 外交部:各方应为俄乌双方恢复直接对话创造条件
  • 法学联合书单|法庭上的妇女
  • 女外交官郑璇已任中国驻莫桑比克大使
  • 首个偏头痛急性治疗药物可缓解前期症状
  • “11+2”复式票,宝山购彩者领走大乐透1170万头奖