郑州轻工业大学2022级程序设计班级天梯赛
题解
总结
由于命题人难度判断失误,本次比赛难度偏难,向各位同学抱歉。
感谢 提供 题目
感谢 的验题&&题面指正
1-1 无所谓,我会出手
输出即可
1-2 数组总和
循环累加答案再输出,注意数据范围,统计答案的变量要开longlong才能存下
1-3 捡到一个矩形
#include<stdio.h>
int main(){
printf("It doesn't matter,I'll do it.");
}
1
2
3
4
5
#include<stdio.h>
int main(){
int n;
scanf("%d", &n);
long long sum = 0;
long long i, x;
for(i = 1; i <= n; i ++ ){
scanf("%lld", &x);
sum += i*x;
}
printf("%lld", sum);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
turtorial
No. 1 / 17
给出的左下角和右上角坐标确定了矩形范围,因此只需要判断该点的 坐标和 坐标均在矩形的范围内即
可。
1-4 字符转换
需要注意的是循环字母表如何处理,详情看代码注释。
码表不需要死记硬背,用 格式输出字符类型即可得到其 码。
注意本题没有严格卡字符串长度到 ,否则如果字符数组只开 的大小应该是过不去的。
#include<stdio.h>
#include<string.h>
int main(){
int t;
scanf("%d", &t);
while (t -- ) {
int x1, x2, y1, y2;
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
int x, y;
scanf("%d%d", &x, &y);
if(x >= x1 && x <= x2 && y >= y1 && y <= y2){
printf("YES\n");
}
else printf("NO\n");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>
#include<string.h>
char s[1000010];
int main(){
scanf("%s", s);
for(int i = 0; i < strlen(s); i ++ ){
// 确定在字母表中的位置
int a = s[i] - 'a' + 1;
// num是本来的位置
int num = s[i] - 'a';
// 得到修改后的位置
num = (num + a) % 26;
// 修改s[i]
s[i] = 'a' + num;
}
printf("%s\n", s);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
turtorial
No. 2 / 17
1-5 捡到了一个成绩
用double类型得到平均数,再判断即可。
1-6 炎爆
注意数组坐标系的含义就是使用二维数组模拟,根据图上对 方向的定义,我们可以通过二维
数组来表示每个位置上受到的伤害。需要注意,pta格式比较严格,不能输出行末空格,否则会判格式错
误。
#include <bits/stdc++.h>
using namespace std;
int q[100], n;
int main () {
scanf("%lld", &n);
double ave = 0;
for (int i = 1; i <= n; i ++ ) scanf("%lld", &q[i]), ave += q[i];
ave = ave * 1.0 / n;
int sum = 0;
for (int i = 1; i <= n; i ++ ) {
if (q[i] > ave) sum += q[i];
}
printf("%.3lf\n%lld\n", ave, sum);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <bits/stdc++.h>
using namespace std;
int mp[510][510], n, q;
int main () {
cin >> n >> q;
for (int i = 1; i <= q; i ++ ) {
int x, y; cin >> x >> y;
char op; cin >> op;
if (op == 'U') {
for (int j = x; j >= 1; j -- ) mp[j][y] ++ ;
}
else if (op == 'R') {
for (int j = y; j <= n; j ++ ) mp[x][j] ++ ;
}
else if (op == 'D') {
for (int j = x; j <= n; j ++ ) mp[j][y] ++ ;
}
else {
for (int j = y; j >= 1; j -- ) mp[x][j] ++ ;
}
}
for (int i = 1; i <= n; i ++ ) {
for (int j = 1; j <= n; j ++ ) {
cout << mp[i][j];
if (j != n) cout << ' ';
}
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
turtorial
No. 3 / 17
1-7 攻略迷宫
需要注意的是,该题如果把时,分,秒分开来看,那么模拟过程会变得十分复杂。因此我们可以把时间
全部转化成秒,这样一段时间间隔直接就可以通过相减得到。并且小A遭受攻击的时间间隔单位也是
秒,这样我们可以得到小A最多受到的攻击次数,和小A的血量取一个 ,就可以得到我们最后受到攻
击的时间。
1-8 去掉重复的数据
注意到数组中的数范围并不是特别大,因此我们可以用一个数组来标记该数是否出现过,如果该数没有
出现过,则直接输出,否则不输出。
同样注意格式问题,pta不允许行末空格,因此用一个ok变量代表是否是第一个数,如果是的话则先不
输出空格,否则先输出一个空格,再输出数。
cout << endl;
}
}
27
28
29
30
#include <stdio.h>
//得到该时间对应的秒数
int get(int h, int m, int s)
{
return h * 3600 + m * 60 + s;
}
// 返回a和b的较小者
int min(int a, int b)
{
return a > b ? b : a;
}
int main()
{
int x, y;
int h1, m1, s1, h2, m2, s2;
//注意输入格式
scanf("%d%d%d:%d:%d%d:%d:%d", &x, &y, &h1, &m1, &s1, &h2, &m2, &s2);
// st表示起始的秒数,ed代表终止的秒数
int st = get(h1, m1, s1), ed = get(h2, m2, s2);
// (ed-st)/y是该时间段内最大受到攻击次数,x是血量上限,两者取较小值才能得到真正受到
攻击的次数,即cnt。一次攻击时间为y,因此攻击总时间是cnt*y,st+cnt*y即为停止攻击的时间。
int cnt = min((ed - st) / y, x), res = st + cnt * y;
// 小时=总秒数/3600,分钟=总秒数%3600/60,秒数=总秒数/60。注意用%02d输出。
printf("%d\n%02d:%02d:%02d\n", cnt, res / 3600, res % 3600 / 60, res %
60);
return 0;
}
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
turtorial
No. 4 / 17
2-1 聚餐
用一个二维数组 代表同学 和同学 是否熟悉,然后对于每一场聚餐,我们可以用两个嵌套
循环来判断这场聚餐的任意两个同学 和 ,将 和 置为 ,在询问 和 是否
熟悉的时候,我们只需要看 是否为 即可。
#include <stdio.h>
// vis[i]代表i这个数出现了几次。
int vis[100010], n;
int main () {
scanf("%d", &n);
//是否输出了第一个空格
int ok = 0;
for (int i = 1; i <= n; i ++ ) {
int x;
scanf("%d", &x);
//如果没有出现过,则输出。
if (vis[x] == 0) {
// 如果是第一次,ok=1,代表后面都需要先输出一个空格
if (!ok) ok = 1;
else printf(" ");
printf("%d", x);
}
// 出现次数++
vis[x] ++ ;
}
}
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>
#define N 110
int query[N][N];
int a[N];
int main()
{
int n, m, q;
scanf("%d%d%d", &n, &m, &q);
while (m--)
{
int k;
scanf("%d", &k);
for (int i = 1; i <= k; i++) scanf("%d", &a[i]);
for (int i = 1; i <= k; i++)
for (int j = i + 1; j <= k; j++)
query[a[i]][a[j]] = query[a[j]][a[i]] = 1;
}
while (q--)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
turtorial
No. 5 / 17