题目大意:

额,题意有点复杂,大概意思就是我们要统计他玩了几个回合,注意哦 边充电边玩 和 玩是不同的状态。总共有n个回合,假如能全部玩完,我们则继续,否则输出-1。玩完的定义是:已知 k>a>b,总电量为k,玩一回合耗电量a,边充边玩耗电量b,而且有个约束,我们规定剩余电量>a才能玩,剩余电量大于b才能边充边玩。假设我们玩了n1回合,边充边玩了n2回合,玩完就是 n1+n2>=n。现在问 在最少玩n个回合的前提下  我们最大能够以a为耗电量玩多少回合。

解题思路

贪心。首先我们看以最少的电量边充边玩是否能玩完,若能玩完证明至少可以输出0,否则输出-1。然后我们看最大能玩多少个回合,然后以此为基础,减少玩的回合增加边充电边玩的回合即可,大不了就是完全边充电边玩嘛,但是这里不能够用暴力验证少玩几个回合,需要公式推一下,具体怎么推额.....有兴趣可以直接在评论区说吧,不过估计也没人看这篇玩意。

本题有一个比较好玩的地方就是, a%b == 0?a/b-1:a/b 即当一个整数能整除一个数时我们输出商-1,否则输出商的向下取整,具体我们可以用一个小技巧完成上式结果相当于: (a-eps)/b,其中eps可以设为1e-8一个小数即可。

AC代码:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
int main() {
int q;
cin >> q;
ll k, n, a, b;
double eps = 1e-9;
for (int i = 0; i<q; i++) {
cin >> k >> n >> a >> b;
int optTurn = 0;
optTurn=(k-eps)/b;
if (optTurn<n) {
cout << -1 << endl;
continue;
}
int optAturn ;
optAturn=(k-eps)/a;
if (optAturn >= n) {
cout << n << endl;
continue;
}
double ma = optAturn*a;
double dif = n - optAturn;
if ((k - ma) > b) {
int bturn = 0;
ll tm=k-(ll)ma;
bturn=(tm-eps)/b;
if (bturn >= dif) {
cout << optAturn << endl;
continue;
}
}
ll x = (ll)ceil(((double)k-eps - ma - dif*(double)b) / (double)(b - a));
cout << optAturn - x << endl;
}
return 0;
}