yzoj P2345 战争 题解

Posted donkey2603089141

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了yzoj P2345 战争 题解相关的知识,希望对你有一定的参考价值。

纯数论

30分:纯暴力,直接模拟判断t秒后,判断hp是否小于0

60分: atk>=h,就是一炮一个,那么军队会在min(n,t)秒之后停止攻击,那么总伤害就是a[n+(n-1)
+(n-2)+........(n-min(n,t)+1)

等差数列求和d=a(2n-min(n,t)+1)*(min(n,t))/2;

如果d>=hp Yes,否则No;

100分

考虑前t秒军队伤害总和,然后和hp比较大小
先算几下打死一个士兵,设m下
那么前m秒伤害为nma
m+1到2m秒伤害为m(n-1)a
以此类推
如果没有支援,那么可以到m(1)a
那么我们考虑支援,将其分开算
对于前面的时间段,每个时间段经历m秒,设k表示有几个经历了m秒的时间段,那么

k=min(n,t/m)

设k个时间段的伤害为d=ma(n)+ma(n-1)......ma(n-k+1)
等差数列求和d=(ma(2n-k+1)k)/2

如果(t/m)<n && t mod m !=0则还有一个时间段,经历了t mod m秒
伤害为(t mod m)(a)(n-k)加入中

最后判断d>=hp如果是输出Yes,否则输出No

代码

#include<bits/stdc++.h>
using namespace std;
int T,flag;
long long hp,atk,n,h,a,t,atck,tmp,k;
int main()
    scanf("%d",&T);
    while(T)
        scanf("%lld %lld %lld %lld %lld %lld",&hp,&atk,&n,&h,&a,&t);
        tmp=h/atk;
        if(h%atk!=0)tmp+=1;
        k=min(n,t/tmp);
        atck=tmp*a*(2*n-k+1)*k/2;
        if(t/tmp<n&&t%tmp!=0)
            atck+=t%tmp*a*(n-k);
        
        if(atck>=hp)
            printf("Yes\n");
        
        else printf("No\n");
        T--;
    
    return 0;

以上是关于yzoj P2345 战争 题解的主要内容,如果未能解决你的问题,请参考以下文章

yzoj P1122 阶乘 题解

题解 P2345 奶牛集会

题解P2345 奶牛集会

yzoj1657货仓选址 题解

yzoj2057 x 题解

yzoj 2372 小B的数字 题解