CF1183C Computer Game 题解

Computer Game

还算水的一道题。

题意

本题意为题面直接翻译的简化版,可能会比题目翻译要复杂。

\(q\) 次询问,每次给出四个数,表示一开始的电亮为 \(k\),有 \(n\) 个回合,不插电玩一个回合则电量会减少 \(a\),插电玩一个回合则电量会减少 \(b\),电量在任何时刻都必须 严格大于 \(0\)

如果能玩完 \(n\) 个回合,输出不插电玩的回合数的最大值;否则输出 \(-1\)

思路

由于 \(k\) 最大为 \(10^9\),直接模拟肯定是不行的。

那么,这题怎样做呢?

首先,电量消耗最少的方案是每回合都插电玩,一共消耗 \(n \times b\) 的电量,只有当 \(k\) 严格大于 它时才能玩完所有回合,否则就可以输出 \(-1\)

如果在玩某一个回合时把电拔了,那么就要多用 \(a - b\) 的电量。

要保证能玩完所有回合,可以用来自由分配的电量就只有 \(k - n \times b - 1\),知道了这个,答案也可以很快地推出来了。

可以不插电玩的回合数的公式为:\(\frac{k - n \times b - 1}{a - b}\)

由于总共只有 \(n\) 个回合,所以答案是不能超过 \(n\) 的,正确答案公式为 \(\min(\frac{k - n \times b - 1}{a - b}, n)\)

要开 long long

Code

点击查看代码
#include <bits/stdc++.h>

using namespace std;

long long q, n, k, a, b;

int main() {
  for (cin >> q; q; q--) {
    cin >> k >> n >> a >> b;
    if (k <= n * b) { // 玩都玩不完
      cout << -1;
    } else {
      cout << min(n, (k - n * b - 1) / (a - b)); // 套上公式即可
    }
    cout << '\n';
  }
  return 0;
}
posted @ 2023-05-17 19:37  wnsyou  阅读(22)  评论(0编辑  收藏  举报