題意:ios
你有n我的,對面有m我的(n,m 1e5)每一個人有個攻擊和防護,攻擊大於等於對方防護能夠消滅對方spa
能夠都存活或者都被消滅。如今讓你安排一些人跟對面的人單挑,要求全殲對面的人並使本身的傷亡數最少code
若是有,輸出最小的傷亡數,若是沒有這種方案,輸出-1.blog
思路:string
維護一個本身的攻擊降序和對面的防護降序,而後掃對面的人,每次把攻擊大於等於當前對面的防護值的人的防護值加入集合,it
若是能夠不死,選擇一個防護大於對面當前攻擊的最小值,若是誰上都要死,那就選個防護最小值就行了(由於當前攻擊打後面的人都夠用了)。io
-1的狀況很好判斷了。被坑了一次set去重。。改了multisetclass
/* *********************************************** Author :devil ************************************************ */ #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <stack> #include <map> #include <unordered_map> #include <string> #include <time.h> #include <cmath> #include <stdlib.h> #define LL long long #define rep(i,a,b) for(int i=a;i<=b;i++) #define dep(i,a,b) for(int i=a;i>=b;i--) #define ou(a) printf("%d\n",a) #define pb push_back #define pii pair<int,int> #define mkp make_pair #define IN freopen("in.txt","r",stdin); #define OUT freopen("out.txt","w",stdout); using namespace std; const int inf=0x3f3f3f3f; const int mod=1e9+7; const int N=1e5+10; int t,n,m; struct wq { int a,b; }a[N],b[N]; bool cmp1(wq a,wq b) { if(a.a!=b.a) return a.a>b.a; return a.b>b.b; } bool cmp2(wq a,wq b) { if(a.b!=b.b) return a.b>b.b; return a.a>b.a; } multiset<int>s; multiset<int>::iterator it; int main() { scanf("%d",&t); for(int cas=1;cas<=t;cas++) { s.clear(); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d%d",&a[i].a,&a[i].b); for(int i=1;i<=m;i++) scanf("%d%d",&b[i].a,&b[i].b); printf("Case #%d: ",cas); if(n<m) { printf("-1\n"); continue; } sort(a+1,a+n+1,cmp1); sort(b+1,b+m+1,cmp2); int ans=n-m,p=1; bool flag=1; for(int i=1;i<=m;i++) { while(p<=n&&a[p].a>=b[i].b) s.insert(a[p].b),p++; if(!s.size()) { flag=0; break; } it=s.upper_bound(b[i].a); if(it==s.end()) s.erase(s.begin()); else ans++,s.erase(*it); } if(flag==0) printf("-1\n"); else printf("%d\n",ans); } return 0; }