CD Making 逻辑数学题

本文介绍了一种算法解决方案,用于解决在特定约束条件下(如避免使用数字13)将歌曲最优地分配到CD上的问题。通过分析歌曲数量与每张CD的最大容量,提出了一种高效的方法来确定所需的最少CD数量。

Tom has NN songs and he would like to record them into CDs. A single CD can contain at most KK songs. In addition, Tom is very superstitious and he believes the number 13 would bring bad luck, so he will never let a CD contain exactly 1313 songs. Tom wants to use as few CDs as possible to record all these songs. Please help him.

Input

There are TT test cases. The first line gives TT, number of test cases. TT lines follow, each contains NN and KK, number of songs Tom wants to record into CDs, and the maximum number of songs a single CD can contain.

1N1000,1K10001≤N≤1000,1≤K≤1000

Output

For each test case, output the minimum number of CDs required, if the above constraints are satisfied.

Sample Input
2
5 2
13 13
Sample Output
3
2
Hint

If Tom has 55 songs to record and a single CD can contain up to 22 songs, Tom has to use 33 CDs at minimum, each contains 22, 22, 11 songs, respectively.

In the second case, Tom wants to record 1313 songs, and a single CD can hold 1313 songs at most. He would have been able to use only 11 CD if he were not so superstitious. However, since he will not record exactly 1313 songs into a single CD, he has to use 22 CDs at least, the first contains 1212 songs and the second contains one(Other solutions to achieve 22 CDs are possible, such as (1111, 22), (1010, 33), etc.).

题目大意:

把n首歌放到CD中,每个CD最多放k首歌,但是每个CD不能放13首,给出n和k求需要的CD数;

思路:k=13时,把k--;k<13时,相除看余数是否进一;k>13时,看余数是否为13,考虑n/k是否为0;

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#define max_n 10010
typedef long long LL;
using namespace std;

int main()
{
	int t,n,k;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d %d",&n,&k);
		if(k==13)
		{
			k--;
			if(n%k==0)
				printf("%d\n",n/k);
			else printf("%d\n",n/k+1);
		}
		else if(n==13 && n<k) //特殊考虑 
			printf("2\n");
		else
		{
			if(n%k==0)
				printf("%d\n",n/k);
			else if(n%k==13)
			{
				if(k==14)
					printf("%d\n",n/k+2);
				else printf("%d\n",n/k+1);
			}
			else printf("%d\n",n/k+1);
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值