读书人

扫灭兔子-贪心

发布时间: 2013-10-17 17:26:17 作者: rapoo

消灭兔子-贪心
1191 .消灭兔子1 秒 空间限制:65536 KB 分值:40有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"。

#include <iostream>#include <cstdlib>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int MAXN = 50001;int B[MAXN];int N,M;typedef struct DP{int di;int pi;friend bool operator<(DP p1,DP p2){return p1.pi > p2.pi;}}Dp;Dp dp[MAXN];priority_queue<Dp>q;bool cmpM(const Dp &a, const Dp &b){return a.di > b.di;}bool cmpN(const int &a, const int &b){return a > b;}int main(){while (cin >> N >> M){for (int i = 0; i < N; ++ i){cin >> B[i];}sort(B,B+N,cmpN);for (int i = 0; i < M; ++ i){cin >> dp[i].di >> dp[i].pi;}sort(dp,dp+M,cmpM);if (N>M){cout << "No Solution"<< endl;return 0;}__int64 sum = 0;int cnt = 0;bool flag = true;int j = 0;for (int i = 0; i < N; ++ i){while (j < M && dp[j].di >= B[i]){q.push(dp[j]);j ++;}if (q.empty()){flag = false;break;}sum += q.top().pi;q.pop();}if (flag){cout << sum << endl;}elsecout << "No Solution"<< endl;}return 0;}

读书人网 >其他相关

热点推荐