dodola · blog

🎉2024牛客寒假营4||补题

687 words3 min read#算法#竞赛编程#牛客寒假营#补题记录算法2024 牛客寒假营 5/6

A-柠檬可乐

题意

输入a,b,ka,b,k,判断ak×ba\ge k\times b是否成立

数据范围

a,b,k(1a,b,k100)a,b,k(1\leq a,b,k\leq 100)

思路

简单判断

参考代码

void solve() {
int a, b, k;cin >> a >> b >> k;
if (a >= k * b)cout << "good\n";
else cout << "bad\n";
}

B-左右互博

题意

nn堆石子,每次选择某堆石子,选一个整数y(2yx)y(2\leq y\leq x),将石子分为xy\lfloor \frac{x}{y} \rfloorxxyx-\lfloor \frac{x}{y} \rfloor,直到某人不能操作时结束,不能操作者输。

数据范围

n,ai(1n,ai2×105)n,a_i(1\leq n,a_i \leq 2\times 10^5)

思路

相当于每次至少分出1个石子出来,计算将所有石头分出1颗一份的操作数,判断拿到最后一颗石子的是谁即可。

参考代码

void solve() {
ll n;cin >> n;
vector<ll>a(n);
ll sum = 0;
for (int i = 0;i < n;i++){
cin >> a[i];
sum += a[i] - 1;
}
if (sum % 2) {
cout << "gui\n";
}
else cout << "sweet\n";
}

C-冬眠

题意

给一个n×mn\times m的字符矩阵,每天有qq次行循环移动或列循环移动,共执行pp次,最后询问第xxyy​列是什么字符。

op=1op=1表示行循环移动

op=2op=2表示列循环移动

数据范围

1n,m,p,q1001\leq n,m,p,q\leq 100

思路

记录循环移动顺序,然后将(x,y)(x,y)的字符逆顺序模拟即可。

参考代码

void solve() {
int n, m, x, y;
cin >> n >> m >> x >> y;
x -= 1, y -= 1;
vector<string>rec(n);
for (int i = 0;i < n;i++) {
cin >> rec[i];
}
int p, q;cin >> p >> q;
vector<pair<int, int>>opz;
for (int i = 0;i < q;i++) {
int z, op;cin >> op >> z;
opz.push_back({ op,z });
}
for (int i = 0;i < p;i++) {
for (int j = q - 1;j >= 0;j--) {
int op = opz[j].first, z = opz[j].second;
if (op == 1 && x == z - 1) {
y -= 1;
y = (y + m) % m;
}
else if (op == 2 && y == z - 1) {
x -= 1;
x = (x + n) % n;
}
// cout << x << " " << y << '\n';
}
}
cout << rec[x][y] << '\n';
}

D-守恒

题意

有一个长度为nn的数组,每次操作可以对数组aa中的两个元素其中一个加1,另一个减1,要求每次操作后各元素任然是正整数,求操作结束后整个数组的最大公约数有多少种不同的值?

数据范围

1n,ai2×1051\leq n,a_i\leq 2\times 10^5

思路

特判n=1n=1的时候(答案为1)

n2n\ge 2时,枚举最大公约数,计数合适的数的数量即可。

参考代码

void solve() {
ll n;cin >> n;
vector<ll>a(n);
ll sum = 0ll;
for (int i = 0;i < n;i++) {
cin >> a[i];sum += a[i];
}
if (n == 1) {
cout << 1 << '\n';return;
}
set<ll>res;
ll f = sum / n;
for (ll k = 1;k * k <= sum;k++) {
if (sum % k == 0) {
ll x = sum / k;
if (x >= n && k <= f) {
res.insert(k);
}
if (k * k != sum && k >= n && sum / k <= f) {
res.insert(sum / k);
}
}
}
cout << res.size() << '\n';
}