牛客周赛 Round 58(上)

会赢吗?

题目描述

登录—专业IT笔试面试备考平台_牛客网

运行代码

#include <iostream>
using namespace std;

int main() {
    double w;
    int h;
    cin >> w >> h;
    if (h - w > 0) {
        cout << "YES" << endl;
    } else {
        cout << "NO" << endl;
    }
    return 0;
}

代码思路

1.变量定义:首先定义了两个变量,w是一个双精度浮点数类型,用来接收一个可能带有小数部分的数值;h是一个整数类型,用于接收一个整数值。

2.输入部分:使用 cin从标准输入流中获取两个数值,并分别存储到变量 w和 h中。

3.判断部分:判断条件 h - w > 0,即判断输入的整数 h减去浮点数 w的结果是否大于零。如果 h比 w大,说明条件成立。

  • 如果条件成立,即 h - w > 0,则输出 "YES",表示满足该条件。
  • 如果条件不成立,即 h - w <= 0,则输出 "NO",表示不满足该条件。

4.返回部分:最后,函数 main返回 0,表示程序正常结束。

随机化游戏时间?

题目描述

登录—专业IT笔试面试备考平台_牛客网

运行代码

#include <iostream>
#include <vector>

using namespace std;
#define int long long
#define P 1000000007

int n, m;
vector<int> a, b, l, r, k;

// 检查函数,用于判断给定值是否满足条件
int check(int x) {
    // 重新计算 b 数组
    for (int i = 0; i < n; i++) {
        b[i + 1] = (a[i] <= x? b[i] + 1 : b[i]);
    }
    for (int i = 0; i < m; i++) {
        int cnt = b[r[i]] - b[l[i] - 1];
        if (cnt > k[i]) return 1;
        else if (cnt < k[i]) return -1;
    }
    return 0;
}

// 快速幂函数
int power(int a, int b) {
    int res = 1;
    while (b > 0) {
        if (b & 1) res = res * a % P;
        a = a * a % P;
        b >>= 1;
    }
    return res;
}

// 求逆元函数
int inverse(int x) {
    return power(x, P - 2);
}

void solve() {
    cin >> n >> m;
    a.resize(n);
    b.resize(n + 1, 0);
    l.resize(m);
    r.resize(m);
    k.resize(m);
    for (int i = 0; i < n; i++) cin >> a[i];
    for (int i = 0; i < m; i++) cin >> l[i] >> r[i] >> k[i];
    int left = 1, right = n;
    while (left <= right) {
        int mid = left + right >> 1;
        if (check(mid) == 1) right = mid - 1;
        else left = mid + 1;
    }
    int ansr = left - 1;
    left = 1, right = n;
    while (left <= right) {
        int mid = left + right >> 1;
        if (check(mid)!= -1) right = mid - 1;
        else left = mid + 1;
    }
    int ansl = left;
    if (ansr == ansl) cout << 1 << " " << ansr << "\n";
    else cout << inverse(ansr - ansl + 1) << "\n";
}

signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int T;
    cin >> T;
    while (T--) solve();
    return 0;
}

代码思路

一、整体思路

  1. 首先定义了多个变量和函数,包括输入数据的大小 n 和 m,数组 ablrk,以及用于检查条件的函数 check、快速幂函数 power、求逆元函数 inverse 和解决问题的函数 solve
  2. 在 solve 函数中,读取输入数据 n 和 m,以及相应的数组 alrk
  3. 通过二分查找的方式确定满足特定条件的区间,最终计算出结果并输出。

二、各个部分的原理

  1. check 函数

    • 这个函数的目的是判断给定的一个值 x 是否满足特定条件。
    • 首先,根据输入数组 a 和给定值 x,重新计算 b 数组。如果 a[i] 小于等于 x,则 b[i] 等于 b[i - 1] + 1,否则 b[i] 等于 b[i - 1]。这样,b 数组实际上记录了 a 数组中小于等于 x 的元素的个数的累计值。
    • 然后,对于每个输入的区间 [l[i], r[i]],计算这个区间内小于等于 x 的元素个数 cnt,即 cnt = b[r[i]] - b[l[i] - 1]
    • 最后,将计算出的 cnt 与给定的 k[i] 进行比较。如果 cnt 大于 k[i],返回 1;如果 cnt 小于 k[i],返回 -1;如果相等,返回 0
  2. power 函数(快速幂)

    • 这个函数用于快速计算 a 的 b 次幂对 P 取模的结果。
    • 通过位运算的方式,当 b 的二进制表示中某一位为 1 时,将当前的结果累乘 a,同时不断将 a 自乘,将 b 右移一位,直到 b 变为 0
  3. inverse 函数(求逆元)

    • 利用费马小定理,当 P 是质数时,a 的逆元为 a^(P - 2)。所以调用 power 函数计算 x 的 P - 2 次幂对 P 取模的结果,即为 x 在模 P 意义下的逆元。
  4. solve 函数

    • 首先读取输入数据,初始化相关数组。
    • 然后使用二分查找的方法确定满足条件的区间。
    • 进行两次二分查找,第一次找到满足条件的右边界 ansr,当 check(mid) 为 1 时,说明当前值 mid 使得区间内小于等于它的元素个数大于 k[i],需要减小 mid,即 right = mid - 1;当 check(mid) 不为 1 时,说明当前值 mid 可能是满足条件的右边界或者还需要增大 mid,即 left = mid + 1
    • 第二次二分查找找到满足条件的左边界 ansl,当 check(mid) 不为 -1 时,说明当前值 mid 可能是满足条件的左边界或者还需要减小 mid,即 right = mid - 1;当 check(mid) 为 -1 时,说明当前值 mid 使得区间内小于等于它的元素个数小于 k[i],需要增大 mid,即 left = mid + 1
    • 最后,根据 ansr 和 ansl 的关系输出结果。如果 ansr == ansl,输出 1 和 ansr;否则,输出 ansr - ansl + 1 在模 P 意义下的逆元。

总的来说,这段代码通过二分查找和特定的条件判断,确定满足条件的区间,并利用快速幂和求逆元的方法计算最终结果。

会赢的!

题目描述

登录—专业IT笔试面试备考平台_牛客网

运行代码

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    int T;
    int x, y;
    cin >> T;
    while (T--) {
        cin >> x >> y;
        if ((x < 0 || y < 0) || abs(x - y) >= 2) 
            cout << "PING" << endl;
        else if ((x + y) % 2 == 0) cout << "NO" << endl;
        else cout << "YES" << endl;
    }
    return 0;
}

代码思路

一、整体思路

  1. 首先从输入中读取测试数据的组数 T
  2. 对于每组测试数据,读取终点坐标 x 和 y
  3. 根据特定的条件判断游戏的结果是阿龙获胜(输出 "YES")、小歪获胜(输出 "NO")还是平局(输出 "PING")。

二、各个部分的原理

  1. 条件判断一:

    • 如果 x < 0 或者 y < 0,说明终点在起点的左方或者上方,这种情况下双方都无法到达终点,所以是平局。
    • 如果 abs(x - y) >= 2,意味着两个坐标的差值较大,双方无法在交替的回合中到达终点,也是平局。
  2. 条件判断二:

    • 考虑到达终点 (x, y)所需的步数,向右走 x 步,向下走 y 步,总共需要 x + y 步。
    • 因为阿龙先手,所以总步数为偶数时阿龙走了偶数步,小歪走了偶数步;总步数为奇数时阿龙走了奇数步,小歪走了奇数步。
    • 如果 (x + y) 是偶数,那么小歪在最后一步,所以阿龙不能获胜,判断小歪获胜(输出 "NO");如果 (x + y) 是奇数,那么阿龙在最后一步,所以判断阿龙获胜(输出 "YES")。

总的来说,这段代码通过对输入的终点坐标进行分析,根据不同的情况判断游戏的结果,利用数学推理和条件判断来确定谁能在游戏中获胜或者是否为平局。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

筱姌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值