2024年河南工业大学2024新生周赛(2)
A ReLU 函数
分段函数,用 if
判断 x 与 0 的大小关系。
- 如果 x ≤ 0,f(x) = 0。
- 如果 x > 0,f(x) = x。
#include <stdio.h>
int main(void) {
int x;
scanf("%d", &x);
if (x <= 0) {
printf("0");
} else {
printf("%d", x);
}
return 0;
}
B 求序列和
n 最大可以取 16,用 int 可能会溢出,因此用 long long。
这题不能用 double,因为 double 的尾数位只有 52 个二进制位,最多只能精确表示 15 或 16 个十进制有效数字。
深入了解可以搜索 IEEE754 标准相关解读。
#include <stdio.h>
int main(void) {
int a, n;
long long sum = 0;
long long term = 0;
scanf("%d %d", &a, &n);
for (int i = 0; i < n; i++) {
term = term * 10 + a; // 构造每一项
sum += term; // 累加到总和
}
printf("%lld", sum);
return 0;
}
C 连续五天早八
判断是否有 5 个连续的 1 即可。
#include <stdio.h>
int main(void) {
int n;
scanf("%d", &n);
int count = 0;
for (int i = 0; i < n; ++i) {
int haveClass;
scanf("%d", &haveClass);
if (haveClass) {
++count;
} else {
count = 0;
}
if (count == 5) {
printf("Yes");
return 0;
}
}
printf("No");
return 0;
}
D 找坐标
嵌套 for
循环,遍历每一行和每一列。如果找到 k
,立刻输出然后结束程序。
#include <stdio.h>
int main(void) {
int n, k;
scanf("%d %d", &n, &k);
/* r 代表行,c 代表列 */
for (int r = 1; r <= n; ++r) {
for (int c = 1; c <= n; ++c) {
int num;
scanf("%d", &num);
if (num == k) {
printf("%d %d", r, c);
return 0;
}
}
}
return 0;
}
E 跑
用秒表示成绩,方便比较。例如 3'45'' 等于 225 秒。
#include <stdio.h>
int main(void) {
int minute, second;
int failCount = 0;
scanf("%d", &minute);
while (minute != -1) {
scanf("%d", &second);
int totalSeconds = minute * 60 + second;
if (totalSeconds <= 207) {
printf("Outstanding\n");
} else if (totalSeconds <= 222) {
printf("Good\n");
} else if (totalSeconds <= 272) {
printf("Pass\n");
} else {
printf("Fail\n");
++failCount;
}
scanf("%d", &minute);
}
printf("%d", failCount);
return 0;
}
F 踱步
按照题目要求模拟过程即可。
#include <stdio.h>
int main(void) {
int n;
scanf("%d", &n);
int lengthSum = 0;
int x = 0, y = 0;
for (int i = 0; i < n; ++i) {
int direction, length;
scanf("%d %d", &direction, &length);
lengthSum += length;
if (direction == 1) {
x += length;
} else if (direction == 2) {
x -= length;
} else if (direction == 3) {
y -= length;
} else {
y += length;
}
}
printf("%d %d\n", x, y);
printf("%d\n", lengthSum);
return 0;
}
G 进位
输入的数字 num 太大,以至于 int 和 long long int 都存不下,因此需要对 num 逐位进行处理。
前面的位加到 9,最后一位加到 10 进一位即可。
注意防止输出最高位是 0 的答案。可以用下面的自测数据检查一下代码。
#include <stdio.h>
int main(void) {
int n;
scanf("%d", &n);
/* 记录是否输出过非 0 数字 */
int nonzero = 0;
for (int i = n; i >= 1; --i) {
int numi;
scanf("%d", &numi);
int xi;
if (i == 1) {
/* 如果是最后一位,num 和 x 的对应位上的数字之和为 10 */
xi = 10 - numi;
} else {
/* 如果不是最后一位,num 和 x 的对应位上的数字之和为 9 */
xi = 9 - numi;
}
/* 防止输出带有前导 0 的数字,例如 009 */
if (i != 1 && xi == 0 && !nonzero) {
continue;
}
nonzero = 1;
printf("%d", xi);
}
return 0;
}
自测输入 1
2
9 1
自测输出 1
9
自测输入 2
3
2 9 1
自测输出 2
709
H 周长之和
很容易发现一个规律:全部矩形重叠在一起组成的大图形周长最小,答案只分别由最宽和最高的两个矩形决定。
#include <stdio.h>
int main(void) {
int n;
scanf("%d", &n);
int maxWidth = 0, maxHeight = 0;
for (int j = 0; j < n; ++j) {
int width, height;
scanf("%d %d", &width, &height);
if (maxWidth < width) {
maxWidth = width;
}
if (maxHeight < height) {
maxHeight = height;
}
}
printf("%d\n", (maxWidth + maxHeight) * 2);
return 0;
}