codeforces 570 div3 Computer Game

题目大意:

额,题意有点复杂,大概意思就是我们要统计他玩了几个回合,注意哦 边充电边玩 和 玩是不同的状态。总共有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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值