1. 程式人生 > >51 Nod 1191消滅兔子

51 Nod 1191消滅兔子

  1. 1 秒
  2. 131,072 KB
  3. 40 分
  4. 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;
}