牛客小白月赛29 A-进攻

牛客小白月赛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;
}

蒟蒻有哪里写得不好的欢迎各位批评指正

猜你喜欢

转载自blog.csdn.net/jotaro07/article/details/110424679