文章目录
3.P2813 母舰
-
题目描述
-
-
思路:
- 先说主体思路:
- 建立两个数组,分别存入攻击系统和防御系统
- 将两个数组进行从小到大排序
- 每次比较以后,将用于打破防御系统的攻击系统值赋值为0
- 最后求和攻击系统的值,所得值即为造成伤害
- 先说主体思路:
-
代码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
const int N = 100010;
int n , m ;
int q1[N] , q2[N];
//快速排序算法模板背诵
void quick_sort(int q[] , int l , int r){
if(l >= r) return ;
int x = q[(l+r)/2];
int i = l - 1 , j = r + 1;
while(i < j){
do i++ ; while(q[i] < x);
do j-- ; while(q[j] > x);
if(i < j ){
swap(q[i],q[j]);
}
}
quick_sort(q,l,j);
quick_sort(q,j+1,r);
}
int main(){
cin >> n >> m;
for(int i = 0 ; i < n ; i++) scanf("%d",&q1[i]);
for(int i = 0 ; i < m ; i++) scanf("%d",&q2[i]);
quick_sort(q1,0,n-1);
quick_sort(q2,0,m-1);
//
// 代码易错点分析:
// 1. flag的作用 :判断当前 防御是否能被攻破 ,不能攻破的话直接输出 0
// 2. j 变量声明在外层的作用 : 避免重复比较 ,减少循环次数 , 提高效率
// 防御 和 攻击 系统都是按照从小到大进行排序
// 在索引为i的防御系统 找到符合条件索引为j的攻击系统后 下一个防御系统能找到符合条件的攻击系统索引肯定在j之后 ,所以攻击系统的遍历可以从j开始。
int j = 0;
for(int i = 0 ; i < n ; i++){
bool flag = false;
for(;j < m ; j++){
if(q2[j] > q1[i]){
flag = true;
q2[j] = 0;
break;
}
}
if(!flag){
printf("0\n");
return 0;
}
}
int sum = 0;
for(int i = 0 ; i < m ; i++) sum += q2[i];
cout << sum << endl ;
}