1593: 丹麦海峡
Time Limit: 1 Sec Memory Limit: 128 Mb Submitted: 375 Solved: 130Description
在丹麦海峡战役中,胡德号在优势情况下率先三轮炮击均未击中俾斯麦号,反被俾斯麦以千分之八的概率的一发入魂。
为了证明自己,你回到了胡德号,作为一名优秀指挥官,你侦查到你的航线上有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
Source
国防科学技术大学第十八届银河之光文化节ACM程序设计竞赛初赛#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#define ull unsigned long long
#define maxn 60
using namespace std;
bool cmp(pair <int,int> a,pair <int,int> b)
{
if(a.second==b.second)
return a.first<b.first;
return a.second>b.second;
}
int main()
{
int t;
cin >> t;
while(t--)
{
int n,m;
ull value=0;
cin >> n>>m;//n num of firearm m num of enemy
pair <int,int> boat[maxn];
std::vector<int> firearm;
for(int i=0;i<m;i++)
{
int d,v;
cin >> d >> v;
boat[i].first=d;
boat[i].second=v;
}
for (int i = 0; i < n; i++)
{
int f;
cin >> f;
firearm.push_back(f);
}
sort(boat,boat+m,cmp);
sort(firearm.begin(),firearm.end());
int i=0,j=0;
while(i!=m&&firearm.size()!=0)
{
int flag=0;
for (std::vector<int>::iterator k = firearm.begin(); k != firearm.end(); k++)
{
flag=0;
if (*k>=boat[i].first)
{
value+=boat[i].second;
flag=1;
i++;
firearm.erase(k);
break;
}
}
if(flag==0)
i++;
}
cout << value << endl;
}
return 0;
}