1191 消滅兔子
基準時間限制:1 秒 空間限制:131072 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。
input
第1行:兩個整數n,m,中間用空格分隔(1 <= n, m <= 50000),分別表示兔子的個數和箭的種類。output第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"。input示例
3 312output示例32 1
3 24 3
6
思路:因為題目要求每種箭只能用一次,所以為了保證能消滅所有兔子,盡量用最大傷害的箭殺最大血量的兔子。但是為了花錢最少,不能單單選取最大傷害,要在能夠殺死兔子的前提下,選取價值最小的。所以將箭的傷害從大到小排序,兔子也從大到小遍歷,能夠殺死當前兔子的加入到以價值為優先順序的佇列中,(能殺死當前兔子一定能殺死後面的兔子)。
這題我竟然難受了一下午,一定是天太熱了。。。。
code:
#include using namespace std;
const int ax = 5e4+66;
int n,m;
int a[ax];
struct nodeb[ax];
int vis[ax];
bool cmp( const node &a , const node &b )
struct cmp1
};priority_queue,cmp1>q;
int main()
for( int i = 0 ; i < m ; i ++ )
sort( a , a + n );
sort( b , b + m , cmp );
memset( vis , 0 ,sizeof(vis) );
int res = 0;
int j = 0 ;
for( int i = n - 1 ; i >= 0 ; i -- )else break;
} if( q.empty() )
res += q.top().q;
q.pop();
} if( res == -1 )else
return 0;
}
51NOD 1191 消滅兔子
1191 消滅兔子 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 有n只兔子,每只有乙個血量b i 需要用箭殺死免子。有m種不同型別的箭可以選擇,每種箭對兔子的傷害值分別為d i 為p i 1 i m 假設每種箭只能使用一次,每只免子也只能被射一次,計算要消滅地...
51 Nod 1191消滅兔子
1 秒131,072 kb 40 分 4 級題 有n只兔子,每只有乙個血量b i 需要用箭殺死免子。有m種不同型別的箭可以選擇,每種箭對兔子的傷害值分別為d i 為p i 1 i m 假設每種箭只能使用一次,每只免子也只能被射一次,計算要消滅地圖上的所有兔子最少需要多少q幣。如不能殺死所有兔子,請輸...
51nod 1191 貪心 優先佇列
有n只兔子,每只有乙個血量b i 需要用箭殺死免子。有m種不同型別的箭可以選擇,每種箭對兔子的傷害值分別為d i 為p i 1 i m 假設每種箭只能使用一次,每只免子也只能被射一次,計算要消滅地圖上的所有兔子最少需要多少q幣。如不能殺死所有兔子,請輸出no solution。特別說明 1 當箭的傷...