HDU

来源:互联网 发布:飘零网络验证金盾 编辑:程序博客网 时间:2024/06/14 07:03

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4950

题目大意:A打B,B的初始血量是h,A打B扣a滴血,打完B马上回复b滴血,打完连续k轮,A需要休息一下,即B不扣血但加血

解题思路:
这里写图片描述
A点为第一次扣血点,如果这点小于1的话,必赢,如果这点大于等于1的话,B点为最后一次扣血点,如果B点小于1的话必赢(因为能让折线往下走的方法是a>b,那么累计下来,B一定是扣血最多的点),C是k轮结束后恢复到的血值,如果这点小于初始值的话,那么进行若干轮,一定赢(相当于把前面的折线平移过来,而且初始位置更低了)

AC代码:

#include<cstdio>#include<algorithm>#include<cstring>#include<map>using namespace std;typedef long long LL;int main(){    int cas = 1;    for (LL h, a, b, k;scanf("%I64d%I64d%I64d%I64d", &h, &a, &b, &k) == 4 && (h || a || b || k);)    {        printf("Case #%d: ", cas++);        if (h - a < 1 || h + k*(b - a) - b < 1 || h + k*(b - a) + b < h)//讨论的就是上面说的三个点            puts("YES");        else            puts("NO");    }    return 0;}
原创粉丝点击