SDWU 2021 新生赛 1st 题解

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

一些想说的话

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

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

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 杯两种奶茶,可列下方的方程式:

\left\{ \begin{matrix} m+n=x \\ am+bn=y \end{matrix} \right.

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

下面来说说本题的坑位:

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

做题还是要细心呀。

解题代码

#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 更新了该帖

相关帖子

欢迎来到这里!

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

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