总体思路: 输入护盾和攻击力,然后快速排序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\n"); 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\n",gongji[i]); ans+=gongji[i];//挨个加起来 } printf("%d\n",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\n"); 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\n",gongji[i]); 49 ans+=gongji[i];//挨个加起来 50 } 51 printf("%d\n",ans);//输出 52 return 0; 53 }