zoukankan      html  css  js  c++  java
  • 洛谷 P2813【母舰】 题解

    总体思路: 输入护盾和攻击力,然后快速排序sort走起来,

    排完序之后从第一个开始找,如果攻击力大于护盾,护盾继续下一个,

    这个攻击力记录为0,如果小雨的话,那就攻击力继续下一个,护盾不动,

    其中最为特别的地方也就是占了很大一部分数据点的,那就是护盾是0这种情况了,当护盾是零的时候,护盾继续下一个找,但是攻击力就不要动了。

    然后让我来分布解析代码

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <complex>
    #include <algorithm>
    #include <climits>
    #include <queue>
    #include <map>
    #include <set>
    #include <iomanip>
    
    using namespace std;
    
    int hudun[100001],gongji[100001];

    这是可食用的头文件,数组用来干啥,拼音打好了qwq

    接下来

         scanf("%d%d",&n,&m);
        for(int i=1; i<=n; ++i) {
            scanf("%d",&hudun[i]);//护盾防御力 
        }
        for(int j=1; j<=m; ++j) {
            scanf("%d",&gongji[j]);//攻击力 
        }

    输入防御系统和攻击力的数量

    分别是n和m

    然后for循环存入数组中去

    然后

    很简单的sort快速排序,虽然这个很容易爆炸,但是用在这个题中还是可以AC的

    sort(hudun+1,hudun+n+1);//快速排序 
    sort(gongji+1,gongji+m+1);//快速排序 

    注意上面必须要+1哦,因为我上面输入的时候是从1开始到n或者到m的而不是从0开始的,如果是从0开始,那这个+1就是真的没用了哦

    下面高潮来了!!!!!!!!!!!!

    最核心的代码部分!!!!!!!!

    int ans=0,js=1,jss=1;//计数器
    while(jss!=n + 1) {//结束条件,也就是防护盾全部攻破的时候
        if(js == m + 1 && jss != n + 1) {
            printf("0
    ");
            return 0;
        }
        if(hudun[jss]==0) {//护盾是零的时候
            jss++;
            continue;
        } else if(hudun[jss]<gongji[js]) {//可以打破护盾的时候
            gongji[js]=0;
            jss++;
            js++;
            continue;
        } else {
            js++;
            continue;
        }
    }

    ans是最后的答案先不用管它,这块用不到的,js是计数攻击力是第几个的计数器,那么jss显而易见就是防御系统的计数器啦

    都从第一个开始找,如果护盾小于攻击力,护盾的计数器就累加,攻击力就变为零,因为可以看做和护盾抵消了

    如果大于或者等于的话,那就继续找,也就是攻击力的计数器js累加,因为sort排好序了所以越往后面找伤害越大的

    前面特判护盾是0的时候,只需要护盾的计数器jss累加就好了

    结束条件当攻击力用完了但是护盾还有剩余的话,就结束输出0就好了

    for(int i=1; i<=m; ++i) {
        //printf("%d
    ",gongji[i]);
        ans+=gongji[i];//挨个加起来
    }
    printf("%d
    ",ans);//输出
    return 0;

    最后从第一个开始累加,消耗掉的都变成了0,所以直接加就好了,加出来的数就是能够造成的伤害

    完整代码双手奉上qwq

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <complex>
     6 #include <algorithm>
     7 #include <climits>
     8 #include <queue>
     9 #include <map>
    10 #include <set>
    11 #include <iomanip>
    12 
    13 using namespace std;
    14 
    15 int hudun[100001],gongji[100001];
    16 
    17 int main() {
    18     int n,m;
    19     scanf("%d%d",&n,&m);
    20     for(int i=1; i<=n; ++i) {
    21         scanf("%d",&hudun[i]);//护盾防御力 
    22     }
    23     for(int j=1; j<=m; ++j) {
    24         scanf("%d",&gongji[j]);//攻击力 
    25     }
    26     sort(hudun+1,hudun+n+1);//快速排序 
    27     sort(gongji+1,gongji+m+1);//快速排序 
    28     int ans=0,js=1,jss=1;//计数器 
    29     while(jss!=n + 1) {//结束条件,也就是防护盾全部攻破的时候 
    30         if(js == m + 1 && jss != n + 1) {
    31             printf("0
    ");
    32             return 0;
    33         }
    34         if(hudun[jss]==0) {//护盾是零的时候 
    35             jss++;
    36             continue;
    37         } else if(hudun[jss]<gongji[js]) {//可以打破护盾的时候 
    38             gongji[js]=0;
    39             jss++;
    40             js++;
    41             continue;
    42         } else {
    43             js++;
    44             continue;
    45         }
    46     }
    47     for(int i=1; i<=m; ++i) {
    48         //printf("%d
    ",gongji[i]);
    49         ans+=gongji[i];//挨个加起来 
    50     }
    51     printf("%d
    ",ans);//输出 
    52     return 0;
    53 }
  • 相关阅读:
    洛谷P1084 [NOIP2012提高组Day2T3]疫情控制
    洛谷P1083 [NOIP2012提高组Day2T2]借教室
    洛谷P2736 “破锣摇滚”乐队 Raucous Rockers
    POJ1692 Crossed Matchings
    洛谷P1315 [NOIP2011提高组Day2T3] 观光公交
    阅读了几个别人写的轮播源码
    js遍历函数
    解决IE6的PNG透明
    04-树5 Root of AVL Tree
    平衡树实现
  • 原文地址:https://www.cnblogs.com/acioi/p/11242106.html
Copyright © 2011-2022 走看看