2020广工文远知行杯新生程序设计竞赛(初赛)B题+C题

来看B题

题面

…有两个孩子来打他们别人打剩的枣子。
枣树甲上有a个枣子(1<=a<=2000),枣树乙上有b个枣子(1<=b<=2000).
孩子每A一下枣树甲,枣树甲的枣子数量x会变成[x/2]个。
孩子每A一下枣树乙,枣树乙的枣子数量x会变成[x/3]个。
他想让两颗枣树的枣子数量相等,他最少需要A多少下?

Input

第一行读入一个整数T(1<=T<=100),表示T组数据。
两个数字a和b表示枣树甲上有a个枣子(1<=a<=2000),枣树乙上有b个枣子(1<=b<=2000).

Output

每组数据输出一个数字,代表孩子最少需要A多少下

Sample Input

1
118 390

Sample Output

4
解释一下:[x]得到的是<=x的最大整数,但由于C语言中/本身就是向下取整的,所以不知道也没有关系。

题目分析

孩子a哪个枣树都是使枣子变少。如果要相同,肯定不能先A枣子数少的,这样做徒增次数,要A枣子多的树次数才可能少。
总体思路就是开个计数器,开个循环,A大的值,然后比较是否相等(相等作为跳出条件),不等,继续A,A变化之后两个值中的大值,相等之后循环跳出。
贴ac代码

#include<stdio.h>
int main()
{
    int T;//T组样例
    scanf("%d",&T);
    int a,b;//枣子数量
    for (int i = 1; i <= T; i++)
    {
        scanf("%d%d",&a,&b);
        int cnt = 0;
        while (a != b)
        {
            if(a>b)
            {
                a/=2;
                cnt++;
            }
            else
            {
                b/=3;
                cnt++;
            }
        }
        printf("%d\n",cnt);//多组样例注意加换行
    }
    return 0;
}

C题题目整体没变。变得有两个地方
1.枣树的a和b范围变大了,变成1<=a,b<=10000了(实际上没有影响,连int都不爆,一点坑都没有,int是2e9)
2.A一颗枣树,可以使枣子数量x变为x^2或者[根号x]个。题面根号x是数学符号,只是我这里打不出来

Sample Input

1
2058 1483

Sample Output

4

题目分析:

这时,x可以变多,那我们就要想了怎么抉择变大变小呢。
x^2 和根号x是互逆的运算(那么好像变大变小没什么区别),对小数x^2得到相同的数,那么根号大数x一样能做到,可题目里的是什么,是[根号x]!取整了!
意味着什么?意味着它向下取整,[根号x]取到的数更多
所以我们的思路就是对大数进行[根号x]操作,直到相等
当然那时候我只是凭思维上的直觉觉得要这么做,没有想这么多。
其实稍微大胆试一下样例,然后就能得到这个思路了

插句话:
我每次遇到题或者困难的时候,第一遍就按照直觉写下过程,之后回过头来思考我为什么要这样想, 其中有没有什么共通的特点或量,可以转化为一个模块或变量,以程序的形式写出来呢?
慢慢的就出来了,心态千万不能急

所以代码只需稍微修改一下。
贴ac代码

#include<stdio.h>
#include<math.h>//为了用sqrt()函数
int main()
{
    int T;//T组样例
    scanf("%d",&T);
    int a,b;//枣子数量
    for (int i = 1; i <= T; i++)
    {
        scanf("%d%d",&a,&b);
        int cnt = 0;
        while (a != b)
        {
            if(a>b)
            {//由于a,b都是int型sqrt(a)则会自动达成[]的效果
                a = sqrt(a);
                cnt++;
            }
            else
            {
                b = sqrt(b);
                cnt++;
            }
        }
        printf("%d\n",cnt);//多组样例注意加换行
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值