1 找最大值

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main() {
int mx = 0;
for (int i = 0; i < 4; i++) {
int x;
scanf("%d", &x);
mx = mx > x ? mx : x;
}
printf("%d\n", mx);
}

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
#include <stdio.h>
int main() {
int n, m;
scanf("%d %d", &n, &m);
int d = m / n;
if (m % n != 0) {
printf("-1\n");
return 0;
}
int x = 0;
int y = 0;
while (d % 2 == 0) {
x++;
d /= 2;
}
while (d % 3 == 0) {
y++;
d /= 3;
}
if (d != 1)
printf("-1\n");
else
printf("%d", x + y);
return 0;
}

3 奕悟

  1. 首先判断开始和结束坐标是否重合,重合则为0。
  2. 其次判断是否为同一条直线上,若在同一条直线上答案为1。
  3. 如果起点和终点的颜色不同,则不能通过指定方式到达。
  4. 其他情况只需要两步就可以到达。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
int main() {
int x1, y1, x2, y2;
scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
if (x1 == x2 && y1 == y2) {
printf("0\n");
} else if (abs(x1 - x2) == abs(y1 - y2)) {
printf("1\n");
} else {
if ((x1 + y1) % 2 == (x2 + y2) % 2) {
printf("2\n");
} else {
printf("-1\n");
}
}
return 0;
}

4 弈研顶针

考虑先斜着达到终点的同行或同列的位置,再到终点。

我们发现最短路径的步数为起点到终点横坐标差纵坐标差的较大值。

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main() {
int x1, y1, x2, y2;
scanf("%d %d %d %d", &x1, &y1, &x2, &y2);

int ans = abs(x1 - x2) > abs(y1 - y2) ? abs(x1 - x2) : abs(y1 - y2);
printf("%d\n", ans);

return 0;
}

5 是奇数吗?

考虑使用前缀和计算区间的和。

修改区间 $[l,r]$ 的值为 $k$ , 修改后的值为

$\sum_{i=1}^{n}a_i-\sum_{i=l}^{r}a_i+(r-l+1)k=pre[n]-(pre[r]-pre[l-1])+(r-l+1)k$

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>

long long a[100010], b[100010];

int main() {
int n, q;
scanf("%d %d", &n, &q);
for (int i = 1; i <= n; i++) {
scanf("%lld", &a[i]);
b[i] = b[i - 1] + a[i];
}
while (q--) {
int l, r, k;
scanf("%d %d %d", &l, &r, &k);
long long x = b[n] + (r - l + 1) * k - (b[r] - b[l - 1]);
if (x % 2)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}

6 它是它的子串吗?

首先较短的串为子串 substr。

讲较长的串复制一遍拼接在其后面,在其中查找是否存在字串 substr。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <bits/stdc++.h>
using namespace std;
int main() {
string str, substr;
cin >> str >> substr;
if (substr.size() > str.size())
swap(str, substr);
str += str;
if (str.find(substr) != -1)
cout << "YES" << endl;
else
cout << "NO" << endl;
return 0;
}

7 死亡顺序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, k;
cin >> n >> k;
pair<int, int> p[n + 1];
int b[n + 1];
for (int i = 1; i <= n; i++) {
cin >> b[i];
b[i] %= k;
if (b[i] == 0)
b[i] = k;
p[i].first = b[i];
p[i].second = n - i + 1;
}
sort(p + 1, p + n + 1);
for (int i = n; i >= 1; i--)
cout << n - p[i].second + 1 << " ";
cout << '\n';
return 0;
}