网易17年内推笔试练习题 - 出专辑

这里写图片描述


JavaCode

import java.util.Scanner;

public class numOfCD {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int s = scan.nextInt();
        int L = scan.nextInt();
        scan.close();

        System.out.println(solve(n, s, L));

    }

    static int solve(int n, int s, int L){
        //计算每张CD能最多能容纳的歌曲数目count。这里可以认为每首歌的长度就是s+1,
        //又因为最后一首歌实际上不需要间隔时间1秒,所以给L增加一个虚拟的1秒长度
        int count = (L+1) / (s+1);

        //如果一张CD就能存下n首歌且n又是13的倍数,那么必须分成两张CD存储
        if(n < count && (n % 13 == 0)) return 2;

        //如果每张CD能容纳的歌曲是13的倍数,则少存放1首歌
        //从而count不可能为13,26,39。。。
        if(count % 13 == 0)
            count--;

        //计算最后一张CD中需要存放的歌曲数
        int remainder = n % count;

        //如果每张CD都正好存满
        if(remainder == 0)
            return n / count;

        //处理特殊情况,如果最后有一张CD中需要存放的歌曲数remainder正好是13的倍数,
        //且每张CD能够容纳的歌曲数正好是remainder+1,则必须将最后一张CD中的歌曲分别存放在2张CD中
        //举例:n=27,count=14,remainder=13,则必须要用三张CD存储
        //对于仅仅只有remainder是13的倍数情况,则不需要增加CD数目,
        //举例:n=28,count=15,remainder=13,两张CD均存14首歌即可
        else if(remainder % 13 == 0 && remainder == count-1)
            return (n / count + 2);
        //不符合上述特殊情况,但remainder不等于0,则需要多一张CD存remainder
        else
            return (n / count + 1);
    }
}

说明

  • 本题主要难点在于分析和处理例外情况,也就是每张CD存储的歌曲数目不能是13的倍数。
  • 本题在牛客网的测试用例不够全面,当把else if(remainder % 13 == 0 && remainder == count-1)这句换成else if(remainder == 13 && count == 14) 时也能AC。实际上,当n=53,s=1, L=51时,两张CD中分别存了27和26首歌,这是不符合要求的,必须要用三张CD了,也就是说后者的写法只是前者写法的一种case,题目要求的不仅仅是每张CD不能存13首歌,而是不能存13的倍数首歌。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值