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 }
  • 相关阅读:
    POJ 3114 Tarjan+Dijkstra
    278. First Bad Version
    209. Minimum Size Subarray Sum
    154. Find Minimum in Rotated Sorted Array II
    153. Find Minimum in Rotated Sorted Array
    710. Random Pick with Blacklist
    767. Reorganize String
    524. Longest Word in Dictionary through Deleting
    349. Intersection of Two Arrays
    350. Intersection of Two Arrays II
  • 原文地址:https://www.cnblogs.com/acioi/p/11242106.html
Copyright © 2011-2022 走看看