(AC)储值购物
题目描述
Nanarikom 正在阅读童话故事。
故事的主人公是正在计划购物的豆娃。豆娃的钱包中有若干张储值卡。在一次购物中,豆娃可以支出 x 单位货币,其中 x 需为不大于 W 的正整数。然后,豆娃通过以下规则决定支付方式:
- A. 在剩余额度大于等于 x 的储值卡中,豆娃选择剩余额度最小的一张储值卡进行支付;
- B. 如果不存在这样的储值卡,则豆娃将新得到一张剩余额度为 W 的储值卡,并使用该储值卡支付;
- C. 使用一张储值卡支付 x 单位货币后,这张储值卡的剩余额度减少 x,随后回到豆娃的钱包中。
豆娃计划进行若干次购物,使得总支出 ∑xi 恰等于给定值 V,而购物的次数和每次购物的支出可以自由分配。
Nanarikom 注意到,尽管总开支不变,但不同的购物方案可能使得豆娃获得不同数量的储值卡。现在,Nanarikom 想知道,在所有的购物方案中,豆娃获得的储值卡数量的最大值。
你需要回答 Nanarikom 的 T 组询问。输入
第一行包含一个整数 T(1≤T≤1000),代表测试数据组数。对于每组测试数据:
一行包含两个整数 V, W(1≤V,W≤105),分别代表豆娃的总支出和每张储值卡的初始额度。输出
对于每组测试数据,输出一行一个整数,代表储值卡数量的最大值。
样例输入
复制
3 5 1 5 2 1 10
样例输出
复制
5 3 1
第一次付W/2 得到一张W/2的卡
第二次付W/2+1 得到W/2-1 所以最大值还是W/2
求V/(W/2+1)
要考虑奇数的情况
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int v,w;
void solve(){scanf("%d%d",&v,&w);if(w==1){printf("%d\n",v);return;}int ans=1;v-=w/2+(w%2);v=max(0,v);ans+=v/(w/2+1);printf("%d\n",ans);
}
int main(){int T;scanf("%d",&T);while(T--){solve();}return 0;
}