HDU 5281 Senior's Gun 杀怪

题意:给出n把枪和m个怪。每把枪有一个攻击力,每个怪有一个防御力。如果某把枪的攻击力不小于某个怪的防御力则能将怪秒杀,否则无法杀死。一把枪最多只能杀一个怪,不能用多把枪杀同一个怪。每杀一次怪可以得到枪的攻击力减去怪的防御力的的分数。求得分的最大值。

贪心。首先我们考虑这样一种情况:用攻击力为A的枪杀防御力为a的怪,攻击力为B的枪杀防御力为b的怪。则得分为A - a + B - b。

不妨设A ≤ B,则有a ≤ A ≤ B,b ≤ B。如果有A < b,那么我们考虑用B杀a,而不使用A枪也不杀b怪,那么得到的分为B - a,和原来的得分相比,多了b分,少了A分,因为A比b小,所以这样的杀怪方式显然得分更大。也就是说,对于某两把枪杀了某两个怪,如果攻击力较低的那把枪杀不了比防御力较高的那个怪,那么就宁愿用攻击力较高的枪去杀防御力较低的怪,不使用攻击力较低的枪也不杀防御力较高的怪。如此看来,对于一种可行的杀怪方案,要想得分最大,那么必须有任意一把使用了的枪的攻击力的不小于任意一个被杀死的怪的防御力。也就是选出来的所有枪和所有怪,随便用哪把枪杀哪个怪是一样的。既然这样,可以先对枪和怪分别按攻击力递增和防御力递增排序,再用攻击力值最大的枪杀防御力值最小的怪,攻击力值第二大的枪杀防御力值第二大的怪,以此类推,直到杀不了怪为止,求得的得分即为最大值。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <set>
using namespace std;

const int MAX = 100005;

int n, m;
__int64 a[MAX], b[MAX];

void input()
{
    scanf("%d%d", &n, &m);
    for(int i = 0; i < n; i++)
        scanf("%I64d", &a[i]);
    for(int i = 0; i < m; i++)
        scanf("%I64d", &b[i]);
}

void solve()
{
    sort(a, a + n);
    sort(b, b + m);
    __int64 ans = 0;
    int i = n - 1, j = 0;
    while(i >= 0 && j < m && a[i] > b[j])
        ans += a[i--] - b[j++];
    printf("%I64d\n", ans);
}

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        input();
        solve();
    }
    return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

HDU 5281 Senior's Gun 杀怪

时间: 2024-08-09 09:28:34

HDU 5281 Senior's Gun 杀怪的相关文章

hdu 5281 Senior&#39;s Gun

题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5281 Senior's Gun Description Xuejiejie is a beautiful and charming sharpshooter. She often carries $n$ guns, and every gun has an attack power $a[i]$. One day, Xuejiejie goes outside and comes across $m

HDU 5281 Senior&amp;#39;s Gun 杀怪

题意:给出n把枪和m个怪.每把枪有一个攻击力,每一个怪有一个防御力.假设某把枪的攻击力不小于某个怪的防御力则能将怪秒杀,否则无法杀死.一把枪最多仅仅能杀一个怪,不能用多把枪杀同一个怪.每杀一次怪能够得到枪的攻击力减去怪的防御力的的分数. 求得分的最大值. 贪心.首先我们考虑这样一种情况:用攻击力为A的枪杀防御力为a的怪,攻击力为B的枪杀防御力为b的怪.则得分为A - a + B - b. 最好还是设A ≤ B,则有a ≤ A ≤ B.b ≤ B.假设有A < b,那么我们考虑用B杀a.而不使用A

HDU 5281 BestCoder Round #47 1002:Senior&#39;s Gun

Senior's Gun Accepts: 235 Submissions: 977 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 学姐姐是一个酷酷的枪手. 她常常会随身携带n把枪,每把枪有一个攻击力a[i]. 有一天她遇到了m只怪兽,每只怪兽有一个防御力b[j].现在她决定用手中的枪消灭这些怪兽. 学姐姐可以用第i把枪消灭第j只怪兽当且仅当b[j]≤a[i],同时她会获

HDU Senior&#39;s Gun (水题)

题意:给n把枪,m个怪兽,每把枪可消灭1怪兽,并获得能量=枪的攻击力-怪兽的防御力.求如何射杀能获得最多能量?(不必杀光) 思路:用最大攻击力的枪杀防御力最小的怪兽明显可获得最大能量.如果每把枪都去射杀刚好1点能量都拿不到的怪物,那简直等于把枪全丢掉. 1 //#pragma comment(linker,"/STACK:102400000,102400000") 2 #include <iostream> 3 #include <stdio.h> 4 #inc

hdu 5280 Senior&#39;s Array

题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5280 Senior's Array Description One day, Xuejiejie gets an array $A$. Among all non-empty intervals of $A$, she wants to find the most beautiful one. She defines the beauty as the sum of the interval. Th

HDU #5283 Senior&#39;s Fish

题目描述: 平面上有一些鱼,初始时鱼会在一些位置,某些时刻编号在一段区间内的鱼会同时向x轴正方向,或y轴正方向平移一定距离,某些时刻会询问一个矩形内鱼的数量. 解题思路: 显然地,求一个矩形内的鱼可以用矩形四个顶点为右上角的整个左下矩形加加减减.那么问题就转化为一个顶点左下角矩形内鱼的数量.注意到鱼只会向右和向上的话,那就很好做.维护两颗线段树,分别维护编号在l~r的鱼的x坐标最大值.y坐标最大值.每次修改对应区间加.每次如果区间最大值大于限制,那就找出最大值的位置,赋为-inf,同时在树状数组

hdu 5280 Senior&#39;s Array(最大子段和)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5280 题意:将一个长度为n的数组,将里面某一个数改为p,使改变后最大子段和最大. 题解:dp[i]=max(dp[i-1)+a[i],a[i]),表示以第 i 个数结束的最大子段和,时间复杂度为O(n). 1)由于n<=1000,可以暴力解决,将每一个数都依次改为p,求出最大的子段和,再去这些最大子段和中最大的,时间复杂度为O(n*n); #include <iostream> #inclu

HDU 5280 Senior&#39;s Array (暴力,水)

题意:给一个数列,再给一个数字p,要求p一定要替换掉数列中的一个元素,然后求最大连续子序列之和. 思路:1000*1000的复杂度,O(n*n) .就是每个都试,然后求和. 1 #include <bits/stdc++.h> 2 #define LL long long 3 #define pii pair<int,int> 4 #define INF 0x7f7f7f7f 5 using namespace std; 6 const int N=2000; 7 int a[N]

[最大子序列和]Hdu 5280 Senior&#39;s Array

题意:一个序列,在其中一个数必须替换成给定数字p的条件下,求最大连续子序列之和. 依次把每一个数替换成p,求每次的最大连续和,找出最大值.O(n^2). #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> typedef long long ll; using namespace std; const int MAXN=1000+5; const int