输入$a,b,k$,判断$a\ge k\times b$是否成立
$a,b,k(1\leq a,b,k\leq 100)$
简单判断
1
2
3
4
5
| void solve() {
int a, b, k;cin >> a >> b >> k;
if (a >= k * b)cout << "good\n";
else cout << "bad\n";
}
|
有$n$堆石子,每次选择某堆石子,选一个整数$y(2\leq y\leq x)$,将石子分为$\lfloor \frac{x}{y} \rfloor$和$x-\lfloor \frac{x}{y} \rfloor$,直到某人不能操作时结束,不能操作者输。
$n,a_i(1\leq n,a_i \leq 2\times 10^5)$
相当于每次至少分出1个石子出来,计算将所有石头分出1颗一份的操作数,判断拿到最后一颗石子的是谁即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
| 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";
}
|
给一个$n\times m$的字符矩阵,每天有$q$次行循环移动或列循环移动,共执行$p$次,最后询问第$x$行$y$列是什么字符。
$op=1$表示行循环移动
$op=2$表示列循环移动
$1\leq n,m,p,q\leq 100$
记录循环移动顺序,然后将$(x,y)$的字符逆顺序模拟即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| 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';
}
|
有一个长度为$n$的数组,每次操作可以对数组$a$中的两个元素其中一个加1,另一个减1,要求每次操作后各元素任然是正整数,求操作结束后整个数组的最大公约数有多少种不同的值?
$1\leq n,a_i\leq 2\times 10^5$
特判$n=1$的时候(答案为1)
$n\ge 2$时,枚举最大公约数,计数合适的数的数量即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| 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';
}
|