51Nod 1191 消滅兔子 (貪心+優先佇列)
阿新 • • 發佈:2018-10-31
對兔子血量排個降序(即從血多的開始殺),對弓箭按傷害值降序排。對每一隻兔子,都要把能殺死他的弓箭的價值入隊,入隊完畢以後,如果佇列為空說明這個兔子殺不了,不為空說明這個兔子能殺,那就從能殺這個兔子的弓箭裡選個最便宜的,按照這樣對n只兔子操作
#include<bits/stdc++.h> using namespace std; #define ll long long const int maxn=5e4+10; struct node { int d,p; node(int dd=0,int pp=0) { d=dd; p=pp; } }a[maxn]; struct node1 { int p; node1(int pp=0) { p=pp; } friend bool operator<(const node1&ii,const node1&oo) { return ii.p>oo.p; } }; bool cmp1(const int&aa,const int&bb) { return aa>bb; } bool cmp2(const node&j1,const node&j2) { return j1.d>j2.d; } int b[maxn]; int main() { int n,m,flag=1; ll ans=0; scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&(b[i])); for(int i=1;i<=m;i++) scanf("%d %d",&(a[i].d),&(a[i].p)); sort(b+1,b+n+1,cmp1); sort(a+1,a+m+1,cmp2); priority_queue<node1>q; while(!q.empty()) q.pop(); for(int i=1,j=1;i<=n;i++) { while(j<=m&&a[j].d>=b[i]) q.push(node1(a[j].p)),j++; if(q.empty()) { printf("No Solution\n"); return 0; } ans+=q.top().p; q.pop(); } printf("%lld\n",ans); return 0; }