1721: 皇家火枪手
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 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<m,a<=10^8 , 0<k<=100)
Output
每组数据输出一个整数表示最少一次要派出多少个火枪手
Sample Input
2
3 1 1
4 2 3
Sample Output
3
1
HINT
Source
模拟即可。用long long。代码如下:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
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;
}