牛客小白月赛29 A-进攻
文章目录
一、题目内容
scimoon 率领的反叛军已经做好了准备
他的手下有 n 个战机,每架战机有一个破坏力 ai
帝国有 m 个基地,每个基地有一个防御值 di,基地有一个价值 vi
若一个战机的攻击力严格大于基地的防御值,则可以破坏该基地,得到这个基地的价值 v
帝国的后备资源很多,一个基地可以被反复破坏
每架战机最多只能选择一个基地攻击,当然也可以不攻击
求能获得的最大贡献
输入描述
一行两个整数, n, m
第二行 n 个整数,表示 ai
第三行 m 个整数,表示 di
第四行 m 个整数,表示 vi
意义与题目描述中一致
输出描述
一行一个整数,表示最大价值
输入用例
3 5
1 2 3
1 2 3 4 5
1 2 3 4 5
输出用例
3
备注:1≤n, m≤106, 0≤ai, di≤109,∣vi∣≤103
二、解题思路
需要最终攻打价值最大,那么思路就是选择可以拿到价值最大的基地一直打,直到后面的飞机攻不下来再寻找价值第二大的基地。所以用贪心,由于基地可以重复销毁,所以找出每架战机可轰炸基地的最大价值,对基地价值和飞机战斗力降序排序之后贪心找一下就可以了
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e6+15;
int a[N];
struct attack
{
int d,v;//基地防御力和基地价值
}base[N];//基地的属性
bool sorting(attack a,attack b)
{
if(a.d == b.d)
return a.v<b.v;//价值相同则比较防御值
else
return a.d<b.d;//比较价值
}
//之前WA是因为没考虑到防御值大但是价值不是最大的情况,这不是贪心想要得到的结果
int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)
cin>>a[i];//战机攻击力
for(int i=0;i<m;i++)
cin>>base[i].d;
for(int i=0;i<m;i++)
cin>>base[i].v;
sort(a,a+n);//战机战斗力排序
sort(base,base+m,sorting);//基地属性排序
int sum=0,j=0;
int temp=0;
//这里稍微注意一下这几个变量的设置位置,包括下面循环体的设计,一不小心就有可能TLE
for(int i=0;i<n;i++)
{
while(j<m && a[i]>base[j].d)
//用for循环写得不到输出用例里的答案,很奇怪
{
temp=max(temp,base[j].v);//贪心
j++;
}
sum+=temp;
}
cout<<sum<<endl;
return 0;
}
蒟蒻有哪里写得不好的欢迎各位批评指正