洛谷 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 }
原文地址:https://www.cnblogs.com/acioi/p/11242106.html