zoukankan      html  css  js  c++  java
  • 【Codeforces Round #700 (Div. 2)】B. The Great Hero

    The great hero guards the country where Homer lives. The hero has attack power A and initial health value B. There are n monsters in front of the hero. The i-th monster has attack power ai and initial health value bi.

    The hero or a monster is said to be living, if his or its health value is positive (greater than or equal to 1); and he or it is said to be dead, if his or its health value is non-positive (less than or equal to 0).

    In order to protect people in the country, the hero will fight with monsters until either the hero is dead or all the monsters are dead.

    • In each fight, the hero can select an arbitrary living monster and fight with it. Suppose the i-th monster is selected, and the health values of the hero and the i-th monster are x and y before the fight, respectively. After the fight, the health values of the hero and the i-th monster become xai and yA, respectively.

    Note that the hero can fight the same monster more than once.

    For the safety of the people in the country, please tell them whether the great hero can kill all the monsters (even if the great hero himself is dead after killing the last monster).

    Input

    Each test contains multiple test cases. The first line contains tt (1t105) — the number of test cases. Description of the test cases follows.

    The first line of each test case contains three integers A (1A106), B (1B106) and n (1n105) — the attack power of the great hero, the initial health value of the great hero, and the number of monsters.

    The second line of each test case contains nn integers a1,a2,,an (1ai106), where ai denotes the attack power of the i-th monster.

    The third line of each test case contains nn integers b1,b2,,bn (1bi106), where bi denotes the initial health value of the i-th monster.

    It is guaranteed that the sum of n over all test cases does not exceed 105.

    Output

    For each test case print the answer: "YES" (without quotes) if the great hero can kill all the monsters. Otherwise, print "NO" (without quotes).

    Example

    input

    5
    3 17 1
    2
    16
    10 999 3
    10 20 30
    100 50 30
    1000 1000 4
    200 300 400 500
    1000 1000 1000 1000
    999 999 1
    1000
    1000
    999 999 1
    1000000
    999

    output

    YES
    YES
    YES
    NO
    YES
    Note

    In the first example: There will be 6 fights between the hero and the only monster. After that, the monster is dead and the health value of the hero becomes 176×2=5>0. So the answer is "YES", and moreover, the hero is still living.

    In the second example: After all monsters are dead, the health value of the hero will become 709, regardless of the order of all fights. So the answer is "YES".

    In the third example: A possible order is to fight with the 1-st, 2-nd, 3-rd and 4-th monsters. After all fights, the health value of the hero becomes −400. Unfortunately, the hero is dead, but all monsters are also dead. So the answer is "YES".

    In the fourth example: The hero becomes dead but the monster is still living with health value 1000999=1. So the answer is "NO".

    题解


    题目大意:

    伟大的英雄守卫着Homer居住的城市。英雄的攻击力为A,健康值为B。在英雄面前有n只怪物,第i只怪物的攻击力为ai,健康值为bi

    当英雄或怪物的健康值为正数时,他是活着的;当他的健康值为非正数时,他就死了。

    为了保护整个国家的人民,英雄会一直和怪物战斗直到英雄或者所有的怪物死了。

    在每一场战斗中,英雄可以任选一只活着的怪物与之战斗。假设第i只怪物被选中了,在战斗前英雄的健康值为x,怪物的健康值为y,战斗后,英雄的健康值变为x-ai,怪物的健康值变为y-A。

    英雄可以多次和同一只怪物战斗。

    为了人民的安全,请告诉他们伟大的英雄是否能杀死所有怪物(如果英雄杀死最后一只怪物后自己也死了,也算能杀死所有怪物)。

    输入:

    第一行一个整数t(1≤t≤105),表示数据组数。

    每组数据第一行有三个整数A(1≤A≤106),B(1≤B≤106),n(1≤n≤105),分别表示英雄的攻击力,健康值,怪物的数量。

    第二行包含n个整数a1,a2,……,an(1<=ai<=106),其中ai表示第i只怪物的攻击力。

    第三行包含n个整数b1,b2,……,bn(1<=bi<=106),其中bi表示第i只怪物的健康值。

    保证t组数据的n之和不超过105

    输出:

    每组数据一行输出一个字符串,如果英雄能杀死所有的怪物输出“YES”,否则输出“NO”。

    部分样例解释:

    在第一组数据中,英雄和怪物总共进行6场战斗,战斗后,所有的怪物都死了,英雄的健康值变为17-6×2=5>0.所以答案为“YES”,并且最后英雄还活着。

    在第二组数据中,无论战斗的顺序怎样,当所有的怪物都死后,英雄的健康值变为709,所以答案为“YES”。

    在第三组数据中,一种可能的战斗顺序为依次和第一只,第二只,第三只,第四只怪物战斗。所有的战斗结束后,英雄的健康值变为-400。很不幸,英雄死了,但是所有的怪物也死了。所以答案为“YES”。

    在第四组数据中,英雄死了,但是怪物的健康值为1000-999=1,仍然活着。所以答案为“NO”。


    依题意,攻击力是用来消耗对方的健康值的。无论战斗的顺序如何,英雄杀死同一只怪物需要进行的战斗次数不变,英雄消耗的健康值也不变。

    输出“YES”的一种情况是,英雄在最后一场战斗中和最后一只怪物同归于尽,而英雄能进行最后一次战斗的条件是,在最后一次战斗前英雄还活着,即健康值大于0。显然对于前n-1只怪物,无论战斗顺序如何,英雄消耗的健康值都是一样的。所以英雄能否杀死所有怪物关键在于最后一只怪物。

    我们可以预处理出杀死每一只怪物所需要消耗的健康值,然后枚举每一只怪物作为最后一只怪物,计算最后一次战斗前英雄的健康值是否大于0,一旦找到一只满足条件的怪物,英雄就能杀死所有怪物。

     1 #include <cstdio>
     2 #define ll long long
     3 int T,A,B,n;
     4 ll a[100005],b[100005],tot,cnt[100005];
     5 int main()
     6 {
     7     int i,j;
     8     bool ok;
     9     scanf("%d",&T);
    10     while (T--)
    11     {
    12         tot=0;
    13         scanf("%d%d%d",&A,&B,&n);
    14         for (i=1;i<=n;i++)
    15           scanf("%d",&a[i]);
    16         for (i=1;i<=n;i++)
    17           scanf("%d",&b[i]),
    18           cnt[i]=(b[i]/A+(b[i]%A!=0))*a[i],
    19           tot+=cnt[i];
    20         ok=0;
    21         for (i=1;i<=n;i++)
    22           if (tot-a[i]<B)
    23           {
    24               ok=1;
    25               break;
    26           }
    27         if (ok) printf("YES
    ");
    28         else printf("NO
    ");
    29     }
    30     return 0;
    31 }

    做出这题感觉悟到了点东西。。。。。看完题目刚开始是想要排序的,也想过很多排序的依据,最开始是想按照bi对A取模的值从小到大排,因为如果bi不能被A整除的话(第i只怪物死后其健康值小于0),英雄的攻击力就会出现浪费(怪物的健康值降到0就会死不需要变为负数),所以我就想先和攻击力浪费最少的怪兽打,减少攻击力的浪费,后来发现其实不管按什么顺序打,要打死同一只怪物就是得浪费这么多攻击力;后来我又想,按怪物的健康值从大到小排序,因为越往后英雄的健康值越小,而攻击力是不变的,把健康值小的怪物(容易死)放到后面打,英雄活下来的可能性更大,但是健康值小的怪物有可能攻击力大,英雄本来到后面健康值就小了,再和攻击力大的怪物打死得更快;于是我又想按怪物的攻击力从大到小排,在英雄健康值比较大(比较耐打)的时候和攻击力大的怪物打,但是这样会和排健康值有类似的问题,有可能后面攻击力小的怪物健康值大(比较耐打),英雄打怪物打半天打不死,英雄自己就先死了……我还想过按攻击力和健康值的性价比来排(但是不会算性价比)…………

    后来我发现要打死一只怪物,该浪费多少攻击力就得浪费多少攻击力,该消耗多少健康值就得消耗多少健康值,和顺序没有关系,而最后英雄能和怪物同归于尽其实只取决于最后一只怪物,于是就有了上面的算法。。。。。

    虽然这题没用到排序,但是感觉对我在解题中用排序的能力会有一定的提升。。。。其实辅助排序在解题中的应用我一直不是很会(*/ω\*)要么该排序的时候没想到排序,要么不该排序的时候拼命往排序想,有时候排序的时候选错了指标(*/ω\*)我觉得要排序的话得排序的清楚目的是什么吧,然后根据目的去选择排序的指标或者决定要不要排序。。。。。还有个前提是顺序不一样会影响最终的结果。。。。不然排序就没有意义了。。。。。比如这道题,我们的目的是要让英雄留下一口气和怪物同归于尽。。。。要留下一口气的话就和健康值有关系了,但是战斗的顺序不会影响打死一只怪物要消耗的健康值,所以这道题就不用排序了。。。。(*/ω\*)

  • 相关阅读:
    PYTHON 函数总结
    PYTHON 模块总结
    python例题21--30
    python例题11--20
    python例题 1--10
    如何选中表格内同类名的某一行?
    table表格td内内容自动换行
    layer弹出层传值到父页面
    DIV内数据删除操作
    锚记搞定窗口滚动
  • 原文地址:https://www.cnblogs.com/rabbit1103/p/14388342.html
Copyright © 2011-2022 走看看