会赢吗?
题目描述
登录—专业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;
}
代码思路
一、整体思路
- 首先定义了多个变量和函数,包括输入数据的大小
n和m,数组a、b、l、r、k,以及用于检查条件的函数check、快速幂函数power、求逆元函数inverse和解决问题的函数solve。 - 在
solve函数中,读取输入数据n和m,以及相应的数组a、l、r、k。 - 通过二分查找的方式确定满足特定条件的区间,最终计算出结果并输出。
二、各个部分的原理
-
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。
- 这个函数的目的是判断给定的一个值
-
power函数(快速幂)- 这个函数用于快速计算
a的b次幂对P取模的结果。 - 通过位运算的方式,当
b的二进制表示中某一位为1时,将当前的结果累乘a,同时不断将a自乘,将b右移一位,直到b变为0。
- 这个函数用于快速计算
-
inverse函数(求逆元)- 利用费马小定理,当
P是质数时,a的逆元为a^(P - 2)。所以调用power函数计算x的P - 2次幂对P取模的结果,即为x在模P意义下的逆元。
- 利用费马小定理,当
-
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;
}
代码思路
一、整体思路
- 首先从输入中读取测试数据的组数
T。 - 对于每组测试数据,读取终点坐标
x和y。 - 根据特定的条件判断游戏的结果是阿龙获胜(输出
"YES")、小歪获胜(输出"NO")还是平局(输出"PING")。
二、各个部分的原理
-
条件判断一:
- 如果
x < 0或者y < 0,说明终点在起点的左方或者上方,这种情况下双方都无法到达终点,所以是平局。 - 如果
abs(x - y) >= 2,意味着两个坐标的差值较大,双方无法在交替的回合中到达终点,也是平局。
- 如果
-
条件判断二:
- 考虑到达终点
(x, y)所需的步数,向右走x步,向下走y步,总共需要x + y步。 - 因为阿龙先手,所以总步数为偶数时阿龙走了偶数步,小歪走了偶数步;总步数为奇数时阿龙走了奇数步,小歪走了奇数步。
- 如果
(x + y)是偶数,那么小歪在最后一步,所以阿龙不能获胜,判断小歪获胜(输出"NO");如果(x + y)是奇数,那么阿龙在最后一步,所以判断阿龙获胜(输出"YES")。
- 考虑到达终点
总的来说,这段代码通过对输入的终点坐标进行分析,根据不同的情况判断游戏的结果,利用数学推理和条件判断来确定谁能在游戏中获胜或者是否为平局。


















