会赢吗?
题目描述
登录—专业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"
)。
- 考虑到达终点
总的来说,这段代码通过对输入的终点坐标进行分析,根据不同的情况判断游戏的结果,利用数学推理和条件判断来确定谁能在游戏中获胜或者是否为平局。