23级深技大c语言第一学期期中考jm隐藏题题解

        2222222

        来啦来啦jm的题来啦

【id:783】【100分】A. 盖大楼啦

题目描述:

        技术大学即将迎来建校五周年校庆,为了祝贺学校建立五周年,校方决定新建一栋教学楼 (我也不知道能建在哪) 。

        施工队现在有a个A材料和b个B材料,而建第i层楼需要i个A材料和i个B材料。

        但是校方觉得这样的教学楼还不够高,于是又拿出了c块钱,每块钱都可以用来买1个A材料或者1个B材料。

        在校生JM想知道,最后的教学楼最多能建多少层。

输入

        第一行输入三个整数a,b,c,以空格隔开。(0<=a,b,c<=10^6)

输出

        一行且只有一个整数,表示教学楼最多能建多少层。

输入样例1

1 2 3

输出样例1

2

输入样例2

1 5 6

输出样例2

3

因为这题没被选中所以看不到其他的测试样例……但是在写的时候我弄了一些特殊值,可以再用来验证一下

输入样例3

1 7 3

输出样例3

2

输入样例4

0 0 5

输出样例4

1

 输入样例5

0 0 1

输出样例5

0

主要思路:

        (因为消耗的a,b数量相等且购买a,b的价格也相等,所以可以节省很多事)

        首先需要判断a和b的情况:

        1.a与b的差值是c可以弥补的。这样子的话就可以先使用一定的钱让a和b的数量相等,再用剩下多余的钱一起买a,b;

        2.a与b的差值是c弥补不了的。这种时候我们就只需要钱全部买最少的那个材料,再考虑最少的材料什么时候会消耗完就行了。


        下面分别是我写的和jm写的

        我写的:

#include <stdio.h>
#include <math.h>

int main() {
	int a, b, c, i = 0;  //i初始化为0防止一层都建不了
	scanf("%d %d %d", &a, &b, &c);
	if (c >= abs(a - b))  //情况1:a与b之差能用c来填补
		a = (a + b + c) / 2;
	else //情况2:a与b之差c已经填补不了了
	{
		a = a > b ? b + c : a + c;
	}
	/* 下面是判断层数 */
	for (; a > 0 && a - (i + 1) >= 0; i++)
	{
		a -= (i + 1);  //因为i初始化为0,所以需要额外加1
	}
	printf("%d", i);
	return 0;
}

第8行应该为"a =  b = (a + b + c) / 2;",但是b后面用不到就删掉了b;

第11行a代表的是最少的材料原来的数量+用c能买到的最少的那个材料的数量。

第10行的语句是这样的:

a = a > b ? b + c : a + c;

如果a>b,那么执行?后":"前的语句,即a = b + c

否则执行":"后的语句,即a = a + c

在第14行的for循环中的"a - (i + 1) >= 0"这个条件是提前判断材料在消耗后是否有出现负数的情况。因为每执行一次for循环都会执行i++,如果在某次循环中a变为了负数,虽然不会执行下一次for循环,但是层数i仍然会加1,这就出现材料不够用但多了一层的问题。

第16行i需要加1的原因是我在第5行给i初始化为了0(防止出现什么材料都没有却多了1层的问题,可以自己代入0 1 0试试)但是建第i层就需要消耗i个材料,很明显不需要建0层,于是需要+1


下面是jm的:

#include <stdio.h>
#include <math.h>

int a, b, c, s, ans;
int main() {
	scanf("%d %d %d", &a, &b, &c);
	if (abs(a - b) > c)
		s = (a < b ? a : b) + c;
	else
		s = (a + b + c) / 2;
	for (int i = 1;; i++)
	{
		ans += i;
		if (ans > s)
		{
			printf("%d", i - 1);
			return 0;
		}
	}
}

在第4行中jm在主函数外面定义了变量,这是全局变量。全局变量的初始值默认为0;--2023.12.3更改

第8行加了括号确定了优先级,语句会先执行"(a < b ? a : b)"再将结果+c;

其他的就是jm是单独用了一个变量s来记录最少的材料的数量,这样子就不需要像我代码第14行那样多判断一个条件了。

jmjmjmjmjmjmjmjmjmjmjmjmjmjmjmjmjmjmjmjmjmjmjmjmjmjmjmjmjmjmjmjmjmmjmjmjmjmjmjmjmjmjmjmjmjmjmjmjmjmjmjmjm

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值