欢迎光临
我们一直在努力

Codeforces Round 1061 (Div. 2)B. Strange Machine

题意:

你有 n 台机器围成一个圆环,其中 n 最多为 20。每台机器要么是 A 型,要么是 B 型。机器按顺时针方向从 1 到 n 编号,第 i 台机器的类型记为 si​。每台机器会接收一个整数 x,并根据其类型更新 x:

A 型:将 x 减 1。形式化地,更新规则为 x:=x−1。

B 型:将 x 替换为它的半向下取整值。形式化地,更新规则为 x:=⌊2x​⌋,其中 ⌊y⌋ 表示对 y 向下取整,即不大于 y 的最大整数。

你会得到 q 次查询,每次查询包含一个整数 a。在每次查询中,你从 1 号机器 开始,手持一个初始整数 a。每一秒钟,会按顺序发生以下两个动作:

  • 当前所在的机器根据自身类型更新 a。
  • 然后,顺时针移动到下一台机器。具体规则为:
    • 若当前在第 i 台机器(1≤i≤n−1),则移动到第 i+1 台。
    • 若当前在第 n 台机器,则移动回第 1 台。
  • 这个过程会持续进行,直到你的整数 a 变为 0。对于每次查询,请计算让 a 变为 0 所需的总秒数。

    注意:所有查询之间相互独立。

    输入

    每个测试包含多组测试用例。第一行是测试用例数 t(1≤t≤104),随后是各组测试用例的描述。

    每组测试用例的第一行包含两个整数 n 和 q(1≤n≤20,1≤q≤104)—— 分别表示机器的数量和查询的数量。

    每组测试用例的第二行是一个字符串 s(∣s∣=n,且 si​ 为 A 或 B)—— 代表各台机器的类型。

    每组测试用例的第三行包含 q 个整数 a1​,a2​,…,aq​(1≤ai​≤109)—— 每次查询的初始整数。

    注意:所有测试用例的 n 之和没有限制。

    保证所有测试用例的 q 之和不超过 104。

    输出

    对于每组测试用例,输出 q 个整数,分别表示每次查询的答案。

    思路:

    每次查询的初始整数a就是从机器1开始循环,直到循环a次,而且机器最多20台,那么机器中但凡有一个B类型,就不会超时,所以只有n台机器全为A类型时会超时,进行单独判断。

    #include <iostream>
    #include <vector>
    using namespace std;
    #define int long long

    void solve()
    {
    int n, q;
    cin >> n >> q;
    string s;
    cin >> s;
    int nb = 0;
    for (int i = 0; i < n; i++)
    {
    if (s[i] == 'B') nb++;
    }
    while (q–)
    {
    int a;
    cin >> a;
    int num = 0;
    int time = 0;
    if (nb == 0)
    {
    cout << a << '\\n';
    continue;
    }
    while (a > 0)
    {
    if (s[num % n] == 'A')
    {
    time++;
    num++;
    a = a – 1;
    }
    else
    {
    time++;
    num++;
    a = a / 2;
    }
    }
    cout << time << '\\n';
    }
    }

    signed main()
    {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int t;
    cin >> t;
    while (t–)
    {
    solve();
    }
    return 0;
    }

    赞(0)
    未经允许不得转载:171主机测评 » Codeforces Round 1061 (Div. 2)B. Strange Machine
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址