题解 P2813 【母舰】

Rbu_nas

2018-10-18 18:12:40

Solution

题意描述:一艘舰M个防御系统,夕立有N发炮弹,打击完防御系统后可以对舰造成伤害,问你最大的伤害值。 贪心,没啥好说的,每次发射伤害离防御值最接近的导弹,注意下“炮弹伤害**大于防御系统**可以摧毁防御系统”就好了。 思路:首先对防御值与伤害值都进行排序,依次枚举防御值$Tex_i$,如果没有找到可以破坏其的导弹$Poi_i$,直接输出$0$。 寻找导弹这里采用的是$STL$炒鸡好用的`upper_bound`。 --- 代码: ```cpp #include <cstdio> #include <cstdlib> #include <algorithm> using namespace std; typedef long long LL; //为了防tot与ans炸随手long long. const int N=100000+5; LL Tex[N], Poi[N], tot_tex, tot_poi, ans; //Tex-防御值 Poi-导弹伤害值. int main(int argc, char const *argv[]) { int m, n; scanf("%d %d", &m, &n); if(n < m) return printf("0")&0; //小优化,如果导弹数量比防御系统数量还少肯定咕咕. for(register int i=1; i<=m; ++i) scanf("%lld", &Tex[i]), tot_tex+=Tex[i]; for(register int i=1; i<=n; ++i) scanf("%lld", &Poi[i]), tot_poi+=Poi[i]; if(tot_poi <= tot_tex) return printf("0")&0; //如果导弹总伤害值都不够打的也凉凉. sort(Tex+1, Tex+m+1); sort(Poi+1, Poi+n+1); //排序,从小到大枚举防御值. for(register int i=1; i<=m; ++i) { int Place=upper_bound(Poi+1, Poi+n+1, Tex[i])-Poi; //找出第一个大于防御值的导弹的位置. if(Poi[Place] < Tex[i]) return printf("0")&0; Poi[Place]=0; } for(register int i=1; i<=n; ++i) ans+=Poi[i]; //累加还没有发射的导弹伤害值. printf("%lld", ans); return 0; } ``` --- 最后求过+赞$\mathfrak{qwq}$ 大家珂以做做[P2695 骑士的工作](https://www.luogu.org/problemnew/show/P2695)来练练手,思路完全一样