美文网首页
2019-02-26 独立的小易- 2018年网易校招

2019-02-26 独立的小易- 2018年网易校招

作者: 做梦枯岛醒 | 来源:发表于2019-02-26 14:35 被阅读13次

    终于又开了一篇,自从查完考研成绩后一直在忙复试的刷题事情,因为查完成绩之后比预估的高40多分,看看别人的成绩觉得还有一丝希望,所以就准备一下复试了,这篇文章对应的这道算法题其实是在查成绩之前就写完的,一直拖到现在才写。

    一. 题目

    小易为了向他的父母表现他已经长大独立了,他决定搬出去自己居住一段时间。一个人生活增加了许多花费: 小易每天必须吃一个水果并且需要每天支付x元的房屋租金。当前小易手中已经有f个水果和d元钱,小易也能去商店购买一些水果,商店每个水果售卖p元。小易为了表现他独立生活的能力,希望能独立生活的时间越长越好,小易希望你来帮他计算一下他最多能独立生活多少天。

    这道题来自于牛客网https://www.nowcoder.com/questionTerminal/a99cdf4e2f44499e80749699cc2ec2b9

    示例参考

    二. 分析

    这个题其实说白了是一道数学题,然后我在做的时候比较绕弯子,最后就被绕进去了。
    后来我就想,既然水果也是财产,能不能把它卖掉换成钱,然后再用这些钱来付房租的反面思想,结果我忽略了一个问题,就是这个水果也是每天必须的,要是有某种情况,水果没了,房租还付的起,就没法继续下一天了,所以这个思路是错误的。(但事实证明这个方法是对了一半,所以测试的时候有的栗子就通过了,有的就没通过)

    最后参考了别人的想法。
    因为我实在是想不到要怎么算。

    下面是代码

    import java.io.*;
    public class Main{
        public static void main(String[] args) throws Exception{
    
            BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
            String s = bf.readLine();
            String[] sv = s.split(" ");
            int rent = Integer.parseInt(sv[0]);
            int fruit = Integer.parseInt(sv[1]);
            int money = Integer.parseInt(sv[2]);
            int price = Integer.parseInt(sv[3]);
        
           
            System.out.println(rent * fruit > money ? money / rent : (money - rent * fruit) / (rent + price) + fruit);
          
        }
    }
    

    前面是输入,不说了,最后输出的是一个很乱的三目表达式,说是装逼也不算装逼,就是觉得这样写简洁一点,下面我们来分解一下。

      System.out.println(rent * fruit > money ? money / rent : (money - rent * fruit) / (rent + price) + fruit);
    

    这个结果算的是

    如果rent * fruit 大于 money 就输出  money / rent
    否则就输出 (money - rent * fruit) / (rent + price) + fruit
    

    那为什么会有这种操作呢?主要是因为上面这个“数学题”会有两种情况。

    • A:带的水果很多,吃到没钱付房租
    • B:带的水果不是很多,最后没钱买水果和付房租

    第一种情况,租金rent * 水果数量(fruit)大于 所带的钱(money),属于A这种,因为水果太多了,每天付租金,付到某天钱付完了都没有把水果吃完。那他返回的结果,当然是money / rent

    第二种情况,水果带的不够,也就是租金rent * 水果数量(fruit)小于 所带的钱(money),太有钱了,老子是土豪,水果吃完了活了fruit天还有钱,还得去买水果那种,就是输出 (money - rent * fruit) / (rent + price) + fruit。
    仔细看看上面这个表达式,是带的钱减去带的水果吃完之前那几日的房租,除以水果吃完后的买水果加上房租的日均价,最后别忘了加上最开始存活的这几天。

    这样看来,其实这个题就是一个数学题。

    3.运行

    由于继续采用了inputstream的骚操作,我们的代码依然控制在很乐观的速度之内。

    4.秀儿操作

    日常分享大神操作,由于这个题基本上思路比较固定,所以没怎么有惊艳的代码,下面分享一下我那个实现一半的想法吧。

    下面是西安工程大学的神山极客童鞋写的代码。
    他就用到了卖掉水果的思想。

    链接:[https://www.nowcoder.com/questionTerminal/a99cdf4e2f44499e80749699cc2ec2b9](https://www.nowcoder.com/questionTerminal/a99cdf4e2f44499e80749699cc2ec2b9)
    来源:牛客网
    
    //只有两种情况,已有水果个数比现有的钱除以房钱的次数多,此时以开房天数来算,
     //否则,就把水果卖了换钱,再用钱除以水果加房钱总和 
    #include using namespace std; 
    int main() { 
            long x, f, d, p;
           cin >> x >> f >> d >> p; 
           long day;
           if (d / x > f)
              day = (d + p * f) / (x + p); 
          else 
              day = d / x; 
          cout << day << endl; return 0;
     }
    

    可以看到仅仅是 day = (d + p * f) / (x + p) 有所不同,总金额变成了d + p * f。

    相关文章

      网友评论

          本文标题:2019-02-26 独立的小易- 2018年网易校招

          本文链接:https://www.haomeiwen.com/subject/bgdayqtx.html