CSU--1721: 皇家火枪手


1721: 皇家火枪手

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 416   Solved: 71
[ Submit][ Status][ Web Board]

Description

CLASH ROYAL是个有趣的游戏,
Johnson最近也是被它深深的迷上了。
火枪手是Johnson最喜欢用的一张卡,可能是感觉火枪打人有种爆头的快感把233
今天Johnson运气貌似特别好,对面选手游戏过程中掉线了
机不可失,Johnson准备派遣自己引以为豪的火枪大军击败对面的守卫塔
此时守卫塔还有m点血量,一个火枪手的攻击力为a点伤害每秒,但是守卫塔同样能够攻击火枪手,
我们假定守卫塔的攻击力正好可以2秒钟打死一个火枪手,那么这个被攻击的火枪手在死前可以对塔造成2*a点的伤害
现在离游戏结束只剩下k秒的时间了,Johnson此刻最少同时要派出多少个火枪手能在游戏结束前干掉对面(我们假定可以一次性派出无数个火枪手,不受圣水的限制)

Input

第一行输出一个T,表示有T组数据
每组数据输入三个正整数 m , a , k (0

Output

每组数据输出一个整数表示最少一次要派出多少个火枪手

Sample Input

2
3 1 1
4 2 3

Sample Output

3
1

HINT

Source

模拟即可。用long long。

代码如下:

#include  
#include  
#include  
#include  
#include  
#include  
using namespace std;
#define N int(2e3+10)  
#define inf int(0x3f3f3f3f)  
#define mod int(1e9+7)  
typedef long long LL;
int main()
{
#ifdef OFFLINE  
	freopen("t.txt", "r", stdin);
#endif  

	LL t, n, m, a, k, num;
	scanf("%lld", &t);
	while (t--){
		LL ans = 0, sum = 0;
		scanf("%lld%lld%lld", &m, &a, &k);
		if (k == 1){
			ans += m / a;
			if (m%a) ans++;
		}
		else{
			num = k / 2;
			sum = 2 * a * (num*(num + 1) / 2);//需要num人
			if (sum >= m){
				while (sum >= m){
					sum -= 2 * a * num;
					num--;
				}
				num++;//通过while找到确切的num
				ans = num;
			}
			else{
				if (k % 2 == 0){
					ans = num;
					m -= sum;
					if (m > 0){//切记防止让负数参与
						//还需加入的人数,这时加入的每个人贡献(2 * a*num)点攻击力
						ans += m / (2 * a*num);
						if (m % (2 * a*num)) ans++;
					}
				}
				else{
					ans = num;
					sum += 2 * a*num + a;//加上留到最后一秒的人的攻击力
					m -= sum;
					ans++;
					if (m > 0){
						ans += m / (2 * a*num + a);
						if (m % (2 * a*num + a)) ans++;
					}
				}
			}
		}
		printf("%lld\n", ans);
	}
	return 0;
}


你可能感兴趣的:(杂)