标签:大于 htm ret input span bsp names 地图 题目
第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
一只兔子只能射一箭,一下子就简单了,将兔子按血量降序排序,将箭按伤害降序排序,然后用个优先队列贪心选择最小价值的箭杀每只兔子ok,
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define INF 0x3f3f3f3f 4 #define LL long long 5 #define MOD 1000000007 6 #define MX 50005 7 struct Arrow 8 { 9 int d, p; 10 bool operator < (const Arrow &b)const{ 11 return p>b.p; 12 } 13 }arr[MX]; 14 15 int n,m; 16 priority_queue<Arrow> Q; 17 int tu[MX]; 18 19 bool cmp1(int &a,int &b){ 20 return a>b; 21 } 22 bool cmp2(Arrow &a,Arrow &b){ 23 return a.d>b.d; 24 } 25 26 int main() 27 { 28 scanf("%d%d",&n,&m); 29 for (int i=1;i<=n;i++) 30 scanf("%d",&tu[i]); 31 sort(tu+1,tu+1+n,cmp1); 32 for (int i=1;i<=m;i++) 33 scanf("%d%d",&arr[i].d,&arr[i].p); 34 sort(arr+1,arr+1+m,cmp2); 35 36 int pos =1; // 多少箭入队 37 int ok=1; 38 LL ans=0; 39 while (pos<=m) 40 { 41 if (arr[pos].d>=tu[1]) 42 { 43 Q.push(arr[pos]); 44 pos++; 45 } 46 else break; 47 } 48 for (int i=1;i<=n;i++) 49 { 50 if (i>1&&tu[i]!=tu[i-1]) 51 { 52 while (pos<=m) 53 { 54 if (arr[pos].d>=tu[i]) 55 { 56 Q.push(arr[pos]); 57 pos++; 58 } 59 else break; 60 } 61 } 62 if (Q.empty()) 63 { 64 ok=0; 65 break; 66 } 67 ans+=Q.top().p;; 68 Q.pop(); 69 } 70 if (ok) 71 printf("%lld\n",ans); 72 else 73 printf("No Solution\n"); 74 return 0; 75 }
标签:大于 htm ret input span bsp names 地图 题目
原文地址:http://www.cnblogs.com/haoabcd2010/p/7608809.html