终于又开了一篇,自从查完考研成绩后一直在忙复试的刷题事情,因为查完成绩之后比预估的高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。
网友评论