Codeforces-Round-937-Div-4

注意: \color{red}{注意:} 注意: 个人博客传送门

A. Stair, Peak, or Neither?

思路:

  • 按照题目意思进行判断即可

时间复杂度: O ( 1 ) O(1) O(1)

void solve() {
    int a[3];
    for (int i = 0; i < 3; i++) {
    	std::cin >> a[i];
    }

    if (a[0] < a[1] && a[1] < a[2]) {
    	std::cout << "STAIR\n";
    } else if (a[0] < a[1] && a[1] > a[2]) {
    	std::cout << "PEAK\n";
    } else {
    	std::cout << "NONE\n";
    }
}

B. Upscaling

思路:

  • C语言基础,利用 for 循环进行图形打印

时间复杂度: O ( n 2 ) O(n^2) O(n2)

void solve() {
    int n;
    std::cin >> n;

    n <<= 1;

    for (int l = 0, p = 0; l < n; l += 2, p++) {
        if (p % 2 == 0) {
            for (int m = 0; m < 2; m++) {
                for (int i = 0, j = 0; i < n; i += 2, j++) {
                    if (j % 2 == 0) {
                        for (int k = 0; k < 2; k++) {
                            std::cout << '#';
                        }
                    } else {
                        for (int k = 0; k < 2; k++) {
                            std::cout << '.';
                        }
                    }
                    if (i + 2 == n) {
                        std::cout << "\n";
                    }
                }
            }
        } else {
            for (int m = 0; m < 2; m++) {
                for (int i = 0, j = 0; i < n; i += 2, j++) {
                    if (j % 2 == 1) {
                        for (int k = 0; k < 2; k++) {
                            std::cout << '#';
                        }
                    } else {
                        for (int k = 0; k < 2; k++) {
                            std::cout << '.';
                        }
                    }
                    if (i + 2 == n) {
                        std::cout << "\n";
                    }
                }
            }
        }
    }
}

C. Clock Conversion

思路:

  • 基础数学换算题,就是取模输出,特判即可

时间复杂度: O ( 1 ) O(1) O(1)

void solve() {
    int h, m;
    scanf("%d:%d", &h, &m);

    bool f = false;
    if (h == 0) {
        h += 12;
    } else if (h == 12) {
        f = true;
    } else if (h > 12) {
        f = true;
        h %= 12;
    }
    if (f) {
        printf("%02d:%02d PM\n", h, m);
    } else {
        printf("%02d:%02d AM\n", h, m);
    }
}

D. Product of Binary Decimals

思路:

  • 由于由 0 或者 1 组成的数,且小于 1 0 5 10^5 105 的个数只有 31 个,所以直接暴搜即可

时间复杂度: O ( 31 × l o g n × d e p t h ) O(31 \times logn \times depth) O(31×logn×depth)

i64 a[33] = {10, 11,
        100, 101, 110, 111,
        1000, 1001, 1010, 1011, 1101, 1100, 1111, 1110,
        10000, 10001, 10010, 10011, 10100, 10101, 10110, 10111, 11000, 11001, 11010, 11011, 11100, 11101, 11110, 11111,
        100000};
std::set<i64> st;

void solve() {
    int n;
    std::cin >> n;

    bool f = true;
    int t = n;
    while (t) {
        if ((t % 10 != 1) && (t % 10) != 0) {
            f = false;
        }
        t /= 10;
    }
    if (f || st.count(n)) {
        std::cout << "YES\n";
    } else {
        auto dfs = [&](auto self, i64 x) -> bool {
            if (st.count(x)) return true;
            for (auto v : st) {
                if (x % v == 0) {
                    i64 t = x / v;
                    if (self(self, t)) {
                        return true;
                    }
                }
            }
            return false;
        };
        if (dfs(dfs, 1LL * n)) {
            std::cout << "YES\n";
        } else {
            std::cout << "NO\n";
        }
    }
}

signed main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int t;
    std::cin >> t;

    for (int i = 0; i < 31; i++) {
        st.insert(a[i]);
    }

    while (t--) {
        solve();
    }    

    return 0;
}

E. Nearly Shortest Repeating Substring

思路:

  • 首先将字符串的长度 n 进行因数分解,这样可以保证,这个循环子串的长度一定累加的结果为 n
  • 然后分别从最前面和最后面判断是否可能出现一个长度为 x 的循环节,可以使得最终的子串只出现一个位置不相同

时间复杂度: O ( n n ) O(n \sqrt n) O(nn )

void solve() {
    int n;
    std::cin >> n;

    std::string s;
    std::cin >> s;

    std::string t = std::string(s.rbegin(), s.rend()); // 方便倒着判断
    std::vector<int> a;
    for (int i = 1; i <= n / i; i++) {
        if (n % i == 0) {
            a.push_back(i);
            a.push_back(n / i);
        }
    }
    std::sort(a.begin(), a.end());

    for (int x : a) {
        auto check = [&](int v) {
            int A = 0, B = A;
            for (int i = x; i < n; i++) {
                if (s[i % v] != s[i]) A++;
                if (t[i % v] != t[i]) B++;
            }
            return A <= 1 || B <= 1;
        };
        if (check(x)) {
            std::cout << x << "\n";
            return ;
        }
    }
}

F. 0, 1, 2, Tree!

思路:

  • 看了 jiangly 的代码,就会发现自己写的好蠢
  • 直接一个宽搜,优先填二叉树的节点,然后填一个树的节点,我们直接每次搜树的高度,记录最后层树的高度,即为最小的树高

时间复杂度: O ( 2 × a + b ) O(2 \times a + b) O(2×a+b)

void solve() {
    int a, b, c;
    std::cin >> a >> b >> c;
    
    if (c != a + 1) {
        std::cout << -1 << "\n";
        return;
    }
    std::queue<int> q;
    q.push(0);
    int ans = 0;
    while (!q.empty()) {
        int x = q.front();
        q.pop();
        ans = x;
        if (a) {
            a--;
            q.push(x + 1);
            q.push(x + 1);
        } else if (b) {
            b--;
            q.push(x + 1);
        }
    }
    std::cout << ans << "\n";
}
  • 18
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值