SDWU 2021 新生赛 1st 题解

本贴最后更新于 1260 天前,其中的信息可能已经时移俗易

一些想说的话

本次比赛的题目是我花了一个多星期才出好的,课余时间一直都在想出什么题比较好,可以说非常用心了, 每一道题都是原创题,网上可能都搜不到一样的题目,所以我也希望大家能够认真对待。非常感谢大家参加本场比赛,不论大家做的怎么样,这都是大家这段时间努力的成果,希望大家再接再厉,下次拿到更好的名次!

题解提供者:江顺
有问题欢迎大家在下面评论或者联系我!

A. 浮点求和-1024 的关爱

解题思路

非常简单的签到题,使用输入语句输入双精度浮点型数据后,保留两位小数输出即可。
注意要使用 doublefloat 的精度不够(只有六位有效数字)。

解题代码

#include<stdio.h> int main() { double a, b, c, d; scanf("%lf%lf%lf%lf", &a, &b, &c, &d); printf("%.5lf", a+b+c+d); return 0; }

B. 黄二上学

解题思路

已知他不会提前两天出发,可以假设一共有 24+6.5 个小时,计算出路上需要花费的时间总和后,使用总共的时间减去花费的时间即为最晚出发的时间(以分钟为单位)。

将这个时间除 60 后(化为小时)取余 24 即为最晚出发的 H,直接除 60 后即可得到 M。

此处有个 printf 输出的小技巧:
使用 %02d 输出时,会右对齐并左补 0。

小提示:
%d 就是普通的输出了
%2d 是将数字按宽度为 2,采用右对齐方式输出,若数据位数不到 2 位,则左边补空格
%02d,和 %2d 差不多,只不过左边补 0
%-2d,和 %2d 一样,不过是左对齐,右补空格
%-02d,左对齐,右补 0

解题代码

#include<stdio.h> #include<math.h> int main() { int s, v; scanf("%d%d", &s, &v); int t_walk = ceil(1.0 * s / v) + 17; int from_zero = 60 * (24 + 6.5) - t_walk; int hh = (from_zero / 60) % 24; int mm = from_zero % 60; printf("%02d:%02d\n", hh, mm); return 0; }

C. 小花 YYDS

解题思路

此题本质上为鸡兔同笼,只需要解 2 个方程组即可得到答案。
设分别购买了 m 杯和 n 杯两种奶茶,可列下方的方程式:

化简移项后,分别解出 即为答案。

下面来说说本题的坑位:

  • 使用 for 循环暴力枚举可能超时(2 层 for 时)
  • 存在 的情况,此时有多个解,且解方程时会出现 ÷0 的情况
  • 存在 的值大于总钱数 的情况,此时会解出负数
  • 存在只购买一种,另一种奶茶没买的情况

做题还是要细心呀。

解题代码

#include<stdio.h> int main() { int n,s,a,b; scanf("%d%d%d%d", &n, &s, &a, &b); if(a!=b && a<=s) { int x=(s-a*n)/(b-a); if(x*b+(n-x)*a == s && x>=0 && n>=0) printf("%d\n%d\n", n-x, x); else printf("No solution."); } else { printf("No solution."); } }

D. 繁忙的乔老师

解题思路

在输入时同时计算为纯成绩。
使用两个变量 max 和 min 分别记录最大值和最小值。
使用 sum 计算求和。
输出时保留两位小数,且减去最大值与最小值,除以(n-2)即为平均值。

此处使用 三目运算符 替代了 if 进行判断,有疑问的同学请自行百度!

注意:本题请使用 double

解题代码

#include<stdio.h> int main() { double a,sum=0,max=0,min=150; int n; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%lf",&a); a = (a+5)*10; sum += a; max = max>a?max:a; min = min<a?min:a; } printf("%.2lf\n",(sum-max-min)/(n-2)); }

E. 菱形输出-小江增强版

解题思路

本题无技巧,只需要找行列(i 和 j)与输出之间的关系即可。主要考察对 for 循环中循环变量的控制。

解题代码

#include <stdio.h> int main() { int n; scanf("%d",&n); for(int t=1;t<=n;t++) { for(int i=t;i<=n;i++) printf(" "); printf("+"); for(int i=1;i<=t-1;i++) printf("%d", i); for(int i=t-2;i>=1;i--) printf("%d", i); if(t!=1) printf("+"); printf("\n"); } for(int t=n;t>=0;t--) { for(int i=t+1;i<=n;i++) printf(" "); printf("+"); for(int i=1;i<=t;i++) printf("%d", i); for(int i=t-1;i>=1;i--) printf("%d", i); if(t!=0) printf("+"); printf("\n"); } return 0; }
3 操作
Shun2002 在 2021-10-11 18:45:44 更新了该帖
Shun2002 在 2021-10-11 18:40:09 更新了该帖
Shun2002 在 2021-10-10 22:32:35 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...