51 Nod 1191消滅兔子
阿新 • • 發佈:2018-12-18
- 1 秒
- 131,072 KB
- 40 分
- 4 級題
有N只兔子,每隻有一個血量B[i],需要用箭殺死免子。有M種不同型別的箭可以選擇,每種箭對兔子的傷害值分別為D[i],價格為P[i](1 <= i <= M)。假設每種箭只能使用一次,每隻免子也只能被射一次,計算要消滅地圖上的所有兔子最少需要多少Q幣。如不能殺死所有兔子,請輸出No Solution。
特別說明:1、當箭的傷害值大於等於兔子的血量時,能將兔子殺死;2、血量B[i],箭的傷害值D[i],箭的價格P[i],均小於等於100000。
收起
輸入
第1行:兩個整數N,M,中間用空格分隔(1 <= N, M <= 50000),分別表示兔子的個數和箭的種類。 第2 - N + 1行:每行1個正整數(共N行),表示兔子的血量B[i](1 <= B[i] <= 100000)。 第N + 2 - N + M + 1行:每行2個正整數(共M行),中間用空格分隔,表示箭所能造成的傷害值D[i],和需要花費的Q幣P[i](1 <= D[i], P[i] <= 100000)。
輸出
輸出最少需要多少Q幣才能消滅所有的兔子。如果不能殺死所有兔子,請輸出"No Solution"。
輸入樣例
3 3 1 2 3 2 1 3 2 4 3
輸出樣例
6
#include<bits/stdc++.h> #include<stdio.h> #include<iostream> #include<cmath> #include<math.h> #include<queue> #include<set> #include<map> #include<iomanip> #include<algorithm> #include<stack> using namespace std; #define inf 0x3f3f3f3f typedef long long ll; int n,m; struct node { int d; int p; } nod[50005]; int B[50005]; bool cmp(node &n1,node &n2) { return n1.d>n2.d; } bool operator<(const node &n1,const node &n2) { return n1.p<n2.p; } priority_queue<int,vector<int>,greater<int> >q; int main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif // ONLINE_JUDGE scanf("%d%d",&n,&m); for(int i=0;i<n;i++) { scanf("%d",&B[i]); } for(int i=0;i<m;i++) { scanf("%d%d",&nod[i].d,&nod[i].p); } sort(nod,nod+m,cmp); sort(B,B+n,greater<int>()); ll ans=0;bool ok=1; int j=-1; for(int i=0;i<n;i++) { while(nod[j+1].d>=B[i]&&j+1<m) { q.push(nod[j+1].p); j++; } if(!q.empty()) { ans+=q.top(); q.pop(); } else {ok=0;break;} } if(!ok)printf("No Solution\n"); else printf("%lld\n",ans); return 0; }