您的位置:首页 > Web前端

UVALive - 7146 Defeat the Enemy [贪心+multiset]

2017-08-20 18:21 471 查看
点击打开链接

题意:

            我方有n支军队,敌方有m支军队,每支军队都有自己的攻击力和防御力,

            每支军队只能攻击(交战)一次,如果一支军队攻击力>=敌军防御力,那么消灭敌军,相反我方被消灭,存在同归于尽。

            现在问你我方能不能全歼敌军,如果能输出我方剩余军队的最大值,不能输出-1;

题解:

           只要我军攻击>=敌军防御 即可击杀,

           所以我军按攻击力降序排序,敌军防御力按降序排序,

           依次拉出防御力最高的敌军消灭,能消灭当前防御的我军,当方能消灭下一个防御更低的敌军,

           这里引入一个muliset,存储能消灭当前敌军的所有我军,然后按照我军防御查找,当然找到防御大于敌军攻击的第一个,删除,没有的话,只能牺牲一个防御最低的。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=1e5+5;
int n,m;
struct node{
int attack,defense;
}Enemy[maxn],Our[maxn];
bool cmp1(node x,node y){
return x.attack>y.attack;
}
bool cmp2(node x,node y){
return x.defense>y.defense;
}
multiset<int>us;
multiset<int> ::iterator it;
int main(){
int T,ca;
scanf("%d",&T);
for(ca=1;ca<=T;++ca){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;++i)
scanf("%d %d",&Our[i].attack,&Our[i].defense);
for(int i=1;i<=m;++i)
scanf("%d %d",&Enemy[i].attack,&Enemy[i].defense);
printf("Case #%d: ",ca);
if(n<m){
puts("-1");
continue;
}
sort(Our+1,Our+n+1,cmp1);
sort(Enemy+1,Enemy+m+1,cmp2);
us.clear();
int pos=1,ans=0,f=1;
for(int i=1;i<=m;++i){
for(int j=pos;j<=n;++j){
if(Our[j].attack>=Enemy[i].defense)
us.insert(Our[j].defense),pos++;
else break;
}
if(us.empty()){
f=0;break;
}else{
it=us.upper_bound(Enemy[i].attack);
if(it!=us.end())
us.erase(it);
else {
us.erase(us.begin());
ans++;
}
}
}
if(f)
printf("%d\n",n-ans);
else
puts("-1");

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: