2022级HAUT新生周赛(一)题解
A
简单的输出
注意输出 " 和 \ 需要在前面加 \
#include <stdio.h> int main() { printf("\"I really love haut!\\n\";"); return 0; }
B 工作罢了
只需要找到数学成绩最高并且输入最早的,并且再计算四项平均成绩即可
#include <stdio.h> int main() { int n; scanf("%d", &n); double ch, ma, en, sc; double s_ch = 0, s_ma = 0, s_en = 0, s_sc = 0; int max_sum = 0, max_math = 0; for (int i = 0; i < n; i++) { scanf("%lf%lf%lf%lf", &ch, &ma, &en, &sc); if (ma > max_math) { max_math = ma; max_sum = ch + ma + en + sc; } s_ch += ch, s_ma += ma, s_en += en, s_sc += sc; } printf("%d\n", max_sum); printf("%.2f %.2f %.2f %.2f", s_ch / n, s_ma / n, s_en / n, s_sc / n); return 0; }
C 挑选礼物,但是收礼人
简单的模拟,用数组(也可以不用)记录初始位置,然后根据输入交换就行
#include <stdio.h> int main() { int n, p; scanf("%d%d", &n, &p); int a[4]; scanf("%d%d%d", &a[1], &a[2], &a[3]); for (int i = 0; i < n; i++) { int b1, b2; scanf("%d%d", &b1, &b2); int k = a[b1]; a[b1] = a[b2]; a[b2] = k; } for (int i = 1; i <= 3; i++) { if (a[i] == p) { printf("%d", i); } } return 0; }
D 表白
输入字符串然后直接循环加和即可
#include <stdio.h> int main() { int n = 0; char str[100010]; scanf("%s", str); for (int i = 0; str[i] != '\0'; i++) { n += str[i]; } printf("%d", n); return 0; } /*#include <stdio.h> int main() { int n = 0; char str[100010]; int i = 0; while (scanf("%c", &str[i]) != EOF) { n += str[i]; i++; } printf("%d", n); return 0; }*/
E 约会?干饭!
简单的博弈论
因为每人每次只能取一个石子,只需要知道石子总数的奇偶性,奇数卷卷赢,偶数聚聚赢
另外注意输出复制粘贴,一个中文叹号一个英文叹号
#include <stdio.h> int n, x, sum; int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &x); sum += x; sum %= 10; // 奇偶性只需要判断个位 } if (sum % 2 != 0) puts("火锅!"); else puts("牛排!"); return 0; }
F 免费餐食 ^o^y
记录最大连续次数的数字和次数即可
#include <stdio.h> int main() { int n,a[1010]; scanf("%d", &n); int ans_num = 0, ans_sum = 0, mid_sum = 1; //mid_sum作为标志记录数字出现连续的次数 for (int i = 0; i < n; i++) { scanf("%d", &a[i]); if(a[i] == a[i-1]) //判断是否和上个数字一样,即是否连续 { mid_sum++; if(mid_sum >= 2) { if(mid_sum == ans_sum) //连续次数一样判断数字大小,要数字大的 { if(a[i] > ans_num) ans_num = a[i]; } else if(mid_sum > ans_sum) //连续次数不一样直接更改 { ans_num = a[i]; ans_sum = mid_sum; } } } else mid_sum = 1; //如果和上个数字不一样,即不连续,就重置mid_sum } printf("%d %d", ans_num, ans_sum); return 0; }
G 好数
判断前后两位递增递减并记录次数,最后递增次数除以递增递减总和即可
也可以用字符判断,更简单了(
#include <stdio.h> int main() { long long n; scanf("%lld", &n); long long x = n % 10; n /= 10; int num_increase = 0, num_decrease = 0, sum = 0; while (n > 0) { int y = n % 10; if (x != y) { sum++; if (x > y) num_increase++; else num_decrease++; } x = y; n /= 10; } double ans = (double)num_increase / (double)sum; if (ans > 0.7) printf("YES ^_^"); else printf("no!!! X_X"); return 0; }
H lycoris
括号配对符合基本语法,即对于相同括号,前括号在前,后括号在后就算匹配成功
(同种括号)记录非匹配括号数量和匹配括号数量,出现前括号非匹配次数++,出现后括号非匹配次数--并且匹配次数++,如果非匹配数量为0,则出现后括号不做变动
#include <stdio.h> int main() { char str[10010]; scanf("%s", str); int s = 0, m = 0, l = 0; int ss = 0, mm = 0, ll = 0; for (int i = 0; str[i] != '\0'; i++) { if (str[i] == '(') s++; else if (str[i] == '[') m++; else if (str[i] == '{') l++; else if (str[i] == ')') { if (s != 0) { s--; ss++; } } else if (str[i] == ']') { if (m != 0) { m--; mm++; } } else if (str[i] == '}') { if (l != 0) { l--; ll++; } } } printf("%d %d %d", mm, ss, ll); return 0; }