丹麦海峡
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 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
****************************************************************/