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

时间:2023-02-12 20:51:43

网易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的倍数首歌。