UVALive 7146-贪心&数据结构stl-Defeat the Enemy

来源:互联网 发布:javascript写网页 编辑:程序博客网 时间:2024/05/22 03:46

https://vjudge.net/problem/158944/origin

比赛的时候想到了思路,但是没有想到多重集。。
给定m个自己的军队 和n个敌人,
军队有攻击力和 防御力, 敌人也是。
1 军队攻击力 大于等于敌人防御值,干死敌人
2 敌人攻击力大于等于自己防御力,干死自己
如果两种情况都存在,同归于尽。
问你如何安排对战,能够让自己战胜所有敌人并且保存下来的军队最多。
Limits:
1 ≤ T ≤ 100, 测试数据数目
1 ≤ n, m ≤ 105//n是自己军队,m是敌人
,
1 ≤ Attacki
, Defensei
, EAttacki
, EDefensei ≤ 1e9// 攻击力 和防御力 都是int类型的数

贪心,根据敌人 防御力从大到小。
敌人i 设定一个数组,里面都是 攻击力大于他的防御力的。(能杀死他的)
如果里面存在一个防御力也大于他攻击力的 ,那么用它。(要求此人防御力越小越好。)
如果不存在,则删除里面一个 防御力最小的。。
这就是比赛时候的思路,但是考虑到我军已经排好序,每次之后都要重新按照防御力在升序。tle了。(开始的考虑中我真的是用数组,所以删除操作也没想好qwq)
代码改良。查找用二分。

#include <bits/stdc++.h>using namespace std;vector<pair<int,int> >q;vector<pair<int,int> >v;bool cmp1(pair<int,int>a,pair<int,int> b){      return a.first>b.first;//俺们的军队按照攻击力排}bool cmp2(pair<int,int>a,pair<int,int>b){     return a.second>b.second;//敌人按照这样来}multiset<int>st;int main(){    int t;     int m,n;     int a,b;     int tt=1;     scanf("%d",&t);     while(t--){           q.clear();           v.clear();           st.clear();           scanf("%d%d",&m,&n);            for(int i=0;i<m;i++){                scanf("%d%d",&a,&b);                q.push_back(make_pair(a,b));            }             for(int i=0;i<n;i++){                scanf("%d%d",&a,&b);                v.push_back(make_pair(a,b));             }             sort(q.begin(),q.end(),cmp1);             sort(v.begin(),v.end(),cmp2);             int j=0;             int sum=0;             bool flag=false;             for(int i=0;i<n;i++){                 while(j<m&&q[j].first>v[i].second){                      st.insert(q[j++].second);                 }                 if(st.empty()){                    flag=true;break;                 }                 multiset<int>::iterator s=st.upper_bound(v[i].first);                  if(s!=st.end()) st.erase(s);                  else {st.erase(st.begin());                  sum++;}             }             if(flag)                printf("Case #%d: -1\n",tt++);             else                printf("Case #%d: %d\n",tt++,m-sum);     }    return 0;}
原创粉丝点击