A. Simple Palindrome
此题考虑把一样的字母放在一起,尽可能分成5份,代码如下:

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
31
#include <bits/stdc++.h>
using ll = long long;
using namespace std;
#define endl '\n'
const ll N = 1e6 + 5;
int a[5];
int main() {
string s = "aeiou";
int t;
cin >> t;
while (t--) {
int x;
cin >> x;
int temp = x / 5;
int temp1 = x % 5;
string ans;
for (int i = 0; i < 5; i++) {
a[i] = temp;
}
for (int i = 0; temp1 > 0; temp1--, i++) {
a[i]++;
}
for (int i = 0; i < 5; i++) {
while(a[i]--) {
ans += s[i];
}
}
cout << ans << endl;
}
return 0;
}

B1 - The Strict Teacher (Easy Version)
此题分为三种情况:
1.学生的位置小于两个老师,则答案为靠学生近的老师坐标 - 1
2.学生的位置大于两个老师,则答案为教室的长度减去靠学生近的老师的坐标
3.学生的位置在两个老师中间,则答案为两个老师的坐标相减除以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
27
28
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define endl '\n'

int main() {
int t;
cin >> t;
while (t--) {
int n, m, q, x, y, a;
cin >> n >> m >> q >> x >> y >> a;
ll ans = 0;
if (a < x && a < y) {
ans = min(x, y) - 1;
}
else if(a > y && a > x) {
ans = n - max(x, y);
}
if (x > y) {
swap(x, y);
}
if (a > x && a < y) {
ans = (y - x) >> 1;
}
cout << ans << endl;
}
return 0;
}

B2 - The Strict Teacher (Hard Version)
此题思想与B1相同,可用lower_bound找到学生在哪两个老师之间,代码如下:

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
31
32
33
34
35
36
37
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define endl '\n'

int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
int n, m, q;
cin >> n >> m >> q;
vector<ll> tp(m);
for (int i = 0; i < m; i++) {
cin >> tp[i];
}
sort(tp.begin(), tp.end());
while (q--) {
ll ans = 0;
ll x;
cin >> x;
if (x < tp[0]) {
ans = tp[0] - 1;
}
else if(x > tp[m - 1]) {
ans = n - tp[m - 1];
} else {
int pos1;
pos1 = lower_bound(tp.begin(), tp.end(), x) - tp.begin();
ans = (tp[pos1] - tp[pos1 - 1]) >> 1;
}
cout << ans << endl;
}
}
return 0;
}

其他的题目后面会补,等更新吧。:)