链接:https://ac.nowcoder.com/acm/contest/8564/A
来源:牛客网
进攻
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
题目描述
scimoon 率领的反叛军已经做好了准备
他的手下有 n 个战机,每架战机有一个破坏力
帝国有 m 个基地,每个基地有一个防御值
,基地有一个价值
若一个战机的攻击力严格大于基地的防御值,则可以破坏该基地,得到这个基地的价值 v
帝国的后备资源很多,一个基地可以被反复破坏
每架战机最多只能选择一个基地攻击,当然也可以不攻击
求能获得的最大贡献
输入描述:
一行两个整数, n,m
第二行 n 个整数,表示
第三行 m 个整数,表示
第四行 m 个整数,表示
意义与题目描述中一致
输出描述:
一行一个整数,表示最大价值
示例1
输入
复制
3 5
1 2 3
1 2 3 4 5
1 2 3 4 5
输出
复制
3
备注:
链接:https://ac.nowcoder.com/acm/contest/8564/A
来源:牛客网
题意:给出你架战斗机的战斗力,再给出你个基地的生命值和摧毁他得到的奖励,只有当战斗力严格大于基地生命时才可以摧毁,等于也不能得到奖励,基地会回复。摧毁他它还会回来。
注意备注他说明会出现负数.
思路:
首先我们这样想,如果两架战机战斗力分别是 且所以如果能取得最大的代价是,基地生命值为所以(这样才能取得这个价值),那么在原基础上最可能取得的就是,其实是当时他就也能取得这个奖励。所以我们就能贪心对战斗机战力进行排序,从大到小,这样大的满足,看小的是否满足条件满足直接加上,不满足就看下一个。然后对基地的奖励进行排序,之所以对奖励不用生命(之所以不用生命是因为你并不知道摧毁他会得到多少奖励,要是有一个生命值小但奖励大的还有一个生命值相对大代价相对小的这样就没法取了)一开始想得对生命排序就偏了些(可能用生命排也对,但是俺没想起来),对奖励排序之后,从大到小,依次判断战斗机是否满足条件。满足基地指针部后移,不满足基地指针后移,再判断,直至到最后一架战机或者最后没有基地满足条件
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math") #pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native") #include <immintrin.h> #pragma GCC optimize(2) #include <map> #include <bits/stdc++.h> #include <queue> #include <string> #include<iostream> #include<stdio.h> #include<string.h> #include <algorithm> #include <math.h> typedef long long ll; typedef unsigned long long ull; using namespace std; typedef pair<ll,ll> pii; #define mem(a,x) memset(a,x,sizeof(a)) #define debug(x) cout << #x << ": " << x << endl; #define rep(i,n) for(int i=0;i<(n);++i) #define repi(i,a,b) for(int i=int(a);i<=(b);++i) #define repr(i,b,a) for(int i=int(b);i>=(a);--i) const int maxn=1e6+1010; #define inf 0x3f3f3f3f #define sf scanf #define pf printf const int mod=998244353; const int MOD=10007; inline int read() { int x=0; bool t=false; char ch=getchar(); while((ch<'0'||ch>'9')&&ch!='-')ch=getchar(); if(ch=='-')t=true,ch=getchar(); while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar(); return t?-x:x; } /* vector<ll> m1; vector<ll> m2; priority_queue<ll , vector<ll> , greater<ll> > mn;//上 小根堆 小到大 priority_queue<ll , vector<ll> , less<ll> > mx;//下 大根堆 大到小 map<ll,ll>mp; */ ll n,a[maxn],m,c[maxn],w[maxn]; struct node { ll d,v; } q[maxn]; bool cmp(node x,node y) { if(x.v==y.v) return x.d<y.d; return x.v>y.v; } int main() { cin>>n>>m; for(int i=1; i<=n; i++) cin>>a[i]; for(int i=1 ; i<=m ; i++) cin>>q[i].d; for(int i=1 ; i<=m ; i++) cin>>q[i].v; ll ans=0; sort(q+1,q+1+m,cmp); sort(a+1,a+1+n); int l=1,r=n; ///l表示基地指针 r表示战斗机指针 while(l<=m) { if(a[r]>q[l].d) { if(q[l].v>0) ans+=q[l].v;///有的小于零 r--; } else { l++; } if(r==0) break; } cout<<ans<<endl; return 0; }