丹麦海峡(贪心)

 丹麦海峡

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 57   Solved: 21
[ Submit][ Status][ Web Board]

Description

在丹麦海峡战役中,胡德号在优势情况下率先三轮炮击均未击中俾斯麦号,反被俾斯麦以千分之八的概率的一发入魂。
为了证明自己,你回到了胡德号,作为一名优秀指挥官,你侦查到你的航线上有m个战斗力不相同的杂鱼们,你对他们的情报一清二楚,包括他们的护甲和价值,胡德号上有n门火炮,已知每门火炮的攻击力,当你的攻击力大于等于敌人的护甲时,则可以命中并击沉敌人。每门火炮在一轮炮击中只能打出1发。请你计算你在一轮炮击中,在击沉最多战舰的情况下,最多能击沉多大价值总和的敌舰。

Input

第一行包含一个整数T(1<=T<=20)
以下有T组数据,
每组数据的第一行包含两个整数n,m(0<=n,m<=50)
第二行包含2*m个整数,Di,Vi(0<=Di,Vi<=10^8)分别表示敌舰的防御和价值
第三行包含n个整数,Ai(0<=Ai<=10^8)表示你火炮的攻击力

Output

对于每组数组输出一个整数,表示你在一轮炮击中击沉敌舰最多的前提下,能击沉多大价值总和的战舰。

Sample Input

3
3 4
2 10 2 10 1 2 1 3
2 2 2
4 4
2 5 3 5 4 5 1 5
1 1 2 4
1 0

100

Sample Output

23
15
0

HINT




按攻击值从小到大,船价值从大到小、防御从小到大。

#include<stdio.h>
#include<algorithm>
#define LL long long
using namespace std;
struct node
{
    LL D,V;
}num[55];
 
bool cmp(node a,node b)
{
    if(a.V==b.V)
    {
        return a.D<b.D;
    }
    return a.V>b.V;
}
 
int main()
{
    int T,n,m;
    LL A[55];
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        for(int i=0;i<m;i++)
        {
            scanf("%lld%lld",&num[i].D,&num[i].V);
        }
        for(int i=0;i<n;i++)
        {
            scanf("%lld",&A[i]);
        }
        if(m>1)
            sort(A,A+n);
        if(n>1)
            sort(num,num+m,cmp);
        bool vis[55]={0};
        LL sum=0;
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(A[i]>=num[j].D&&!vis[j])
                {
                    sum+=num[j].V;
                    vis[j]=1;
                    break;
                }
            }
        }
        printf("%lld\n",sum);
 
    }
    return 0;
 
}
 
/**************************************************************
    Problem: 1593
    User: aking2015
    Language: C++
    Result: Accepted
    Time:4 ms
    Memory:972 kb
****************************************************************/



你可能感兴趣的:(-,国防科学技术,丹麦海峡,Contest2077)