csuoj-1721-皇家火枪手

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

这道题就是一个塔,然后我要出n个兵,每个兵活2s,每次打a点伤害,我还有ks时间,问出兵的最小值。

一开始这道题是队友读的,然后全场好像不少人做了,但是准确率都不高,队友wa了一次,我看着很心急啊,因为他们题都读错了。这道题是最后还有几分钟我们敲出来的。其实就是一个还行的模拟题吧。最后我的想法是既然顺着不好求,就反着来,假定一个兵不死,然后分奇偶推公式来算出多打的那么一部分伤害。然后就a了

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
 
typedef long long ll;
 
 
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int minn=99999999;
        ll m,a,k;
        int ans=0;
        scanf("%lld%lld%lld",&m,&a,&k);
        for(int i=1;i<=k;i++)
        {
            if(i%2==1)
            {
                ll N=m+(((i-1)*(i-1))/4)*a;
                ans=N/(i*a);
                if(ans*i*a!=m)
                    ans++;
                if(ans<minn)
                {
                    minn=ans;
                }
            }
            else
            {
                ll N = m + (1 + (i - 2) / 2) * ((i - 2) / 2) * a;
                ans =N/(i*a);
                if(ans*i*a!=m)
                    ans++;
                if(ans<minn)
                {
                    minn=ans;
                }
            }
        }
        printf("%d\n",minn);
    }
    return 0;
}


你可能感兴趣的:(csuoj-1721-皇家火枪手)