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

牛客周赛 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 1000000007int 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")。

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 文心快码前端工程师观点分享:如何保证在企业内落地?
  • 【数学建模】2024数学建模国赛经验分享
  • 无线会议解决方案
  • 石头科技闪耀IFA百年展:斩获多项大奖,全球知名媒体一致好评
  • 10个C++绘图案例
  • 【大模型专栏—入门篇】CUDA入门与AutoDL“炼丹”
  • 34465A-61/2 数字万用表(六位半)
  • 爬虫基础知识+豆瓣电影实战
  • 《数据结构(C语言版)第二版》第八章-排序(8.5-归并排序、8.6基数排序)
  • 苹果iOS/ iPadOS18 RC 版、17.7 RC版更新发布
  • Docker容器管理的10个基础命令
  • 区块链媒体:区块链媒体套餐倾心推广解析!
  • kafka单条消息过大发送失败
  • 828华为云征文 | Flexus X实例CPU、内存及磁盘性能实测与分析
  • 软件设计师の第一章:计算机组成与结构
  • classpath对获取配置文件的影响
  • JAVA 学习IO流
  • nfs客户端进程变D,延伸linux的lock
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • React组件设计模式(一)
  • Redux系列x:源码分析
  • spring学习第二天
  • vue:响应原理
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • ​14:00面试,14:06就出来了,问的问题有点变态。。。
  • #QT 笔记一
  • #window11设置系统变量#
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (第27天)Oracle 数据泵转换分区表
  • (回溯) LeetCode 40. 组合总和II
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (面试必看!)锁策略
  • (学习日记)2024.01.19
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)VC++中ondraw在什么时候调用的
  • (转)Windows2003安全设置/维护
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • ***测试-HTTP方法
  • .net 无限分类
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET是什么
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @KafkaListener注解详解(一)| 常用参数详解
  • @Repository 注解
  • @RequestParam,@RequestBody和@PathVariable 区别
  • [100天算法】-二叉树剪枝(day 48)
  • [240903] Qwen2-VL: 更清晰地看世界 | Elasticsearch 再次拥抱开源!
  • [AI]ChatGPT4 与 ChatGPT3.5 区别有多大