开封菜餐厅最近在口袋炸鸡店推出了活力早餐套餐,只需要**¥45**,购买可以获得一份罗德岛可颂干员的皮肤和6个可颂面包,三杯咖啡。有两位小姐姐,分别是莫斯提马和能天使。莫斯提马和能天使为了获得可颂的皮肤,于是她们相约一起去吃这个套餐。她们拥有 N 个罗德岛账号,所以她们需要通过吃 N 顿活力套餐来获得足够多的皮肤。她们为了能够尽快获得足够多的皮肤,所以她们决定每天吃一顿,这样只要花N天就可以获得足够多的皮肤了。但是,她们俩都不喜欢喝开封菜的咖啡,如果在某天早餐,她们其中一个人喝了咖啡,她们都会不开心。喝了咖啡的那天的不开心值**相当于前一天**的不开心值**+1**,如果是第一天喝了咖啡,那么对应的不开心值是1,如果某一天没有喝咖啡,那么那天的不开心值是0.当然她们可以选择不喝咖啡,然后去额外买豆浆来喝,豆浆**¥7/杯**。由于可颂面包非常的干,所以她们每人每次吃的时候都必须要喝一杯咖啡/豆浆。现在她们俩希望你能帮忙算出,在只有 S 块钱,要获得 N 个可颂皮肤,最低的不开心值总和是多少?
输入格式
多组测试数据,第一行一个T代表case数 接下来T行,每行两个整数,
N(1≤N≤30)代表需要获取的可颂皮肤数量,
S(45×N≤S≤1000000000)代表能天使和莫斯提马一开始钱包有多少钱。
输出格式
T行,每行一个整数,代表最小的不开心值。
输入样例
5
1 45
1 100
2 90
2 110
2 200
输出样例
1
0
3
1
0
这题我卡在当s>=45 x n&&s<=45 x n+14 x n (x是乘号)
怎么寻找最优解
https://blog.csdn.net/qq_43728862/article/details/95866353
每天的选择是两种:
1. 省钱用法:用45元 = 一个皮肤加“不开心”+1
2. 开心用法:用45 + 14元 = 一个皮肤加“不开心”清零
所以S的范围 45 * n <= S < (45 + 14) * n时,需要用策略计算。
首先,最大化开心用法,尽可能地将累计的不开心清零。
第二,因为省钱用法,不开心会递增,因此尽可能平均分布连续的不开心。
m = (s - 45 * n) / 14,向下取整,得到开心用法的最大个数,从而使我们有 m 个清零点,对应 m + 1个连续分段。
那么单个分段的连续天数: days = (n - m) / (m + 1), 向下取整。
剩余的天数,再平均分配到 m + 1个分段上: residue = n - m - days * (m + 1)
结论就是 residue个分段是连续的 days + 1 天, m + 1 - residue个分段是 days天,中间间隔的是 m 个开心用法的天。
再累加所有不开心天的不开心数值,就是结果。