首页 > 其他分享 >51nod-1191 消灭兔子

51nod-1191 消灭兔子

时间:2023-06-12 17:38:16浏览次数:61  
标签:node Node 51nod 兔子 1191 int num include


原题链接







1191 消灭兔子



题目来源:  2013腾讯马拉松赛第三场


基准时间限制: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),分别表示兔子的个数和箭的种类。第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)。


Output


输出最少需要多少Q币才能消灭所有的兔子。如果不能杀死所有兔子,请输出"No Solution"。


Input示例


3 3123 2 1 3 2 4 3


Output示例


6




把兔子的血量存在num数组中,从小到大排序,把箭存在node数组中按照伤害从小到大排序,i = n-1 to 0遍历每个兔子num[i], 把能够杀死兔子的箭放在优先队列中,优先队列按照q币从小到大排序,每次取出最便宜但又能杀死兔子的箭,pop(), 然后遍历下一只兔子

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#define maxn 50005
using namespace std;
typedef long long ll;

struct Node{
	Node(){
	}
	Node(int a, int b){
		d = a;
		p = b;
	}
	int d, p;
	friend bool operator < (const Node&a, const Node&b){
		return a.p > b.p;
	}
}node[maxn];
int num[maxn];
bool cmp(const Node&a, const Node &b){
	return a.d < b.d;
}
int main(){
	
//	freopen("in.txt", "r", stdin);
	int n, m;
	
	scanf("%d%d", &n, &m);
	for(int i = 0; i < n; i++)
	 scanf("%d", num+i);
	for(int i = 0; i < m; i++)
	 scanf("%d%d", &node[i].d, &node[i].p);
	if(m < n){
		puts("No Solution");
		return 0;
	} 
	ll ans = 0;
	sort(node, node+m, cmp);
	sort(num, num+n);
	priority_queue<Node> q;
	int j = m-1;
	for(int i = n-1; i >= 0; i--){
		for(; j >= 0; j--){
			if(node[j].d >= num[i])
			 q.push(node[j]);
			else
			 break;
		}
		if(q.empty()){
			puts("No Solution");
			return 0;
		}
		ans += q.top().p;
		q.pop();
	}
	printf("%I64d\n", ans);
	
	return 0;
}




标签:node,Node,51nod,兔子,1191,int,num,include
From: https://blog.51cto.com/u_16158872/6464254

相关文章

  • 51nod-1158 全是1的最大子矩阵(单调栈)
    原题链接1158 全是1的最大子矩阵基准时间限制:1 秒空间限制:131072 KB分值: 80 难度:5级算法题 收藏 关注Input第1行:2个数m,n中间用空格分隔(2 <= m,n <= 500)第2 - N + 1行:每行m个数,中间用空格分隔,均为0或1。......
  • bzoj1001 [BeiJing2006]狼抓兔子(网络流dinic算法||最短路spfa)
    http://www.lydsy.com/JudgeOnline/problem.php?id=10011001:[BeiJing2006]狼抓兔子TimeLimit: 15Sec  MemoryLimit: 162MBSubmit: 24017  Solved: 6068[Submit][Status][Discuss]Description现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓......
  • 动态规划基础之矩阵取数问题 51nod1083
    题目地址:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1083题目:1083 矩阵取数问题基准时间限制:1 秒空间限制:131072 KB分值: 5 难度:1级算法题例如:3*3的方格。133213221......
  • 51nod 1298 圆与三角形(基础题,计算几何)
    题目链接:点击打开链接1298 圆与三角形题目来源: HackerRank基准时间限制:1 秒空间限制:131072 KB分值: 0 难度:基础给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交。相交输出"Yes",否则输出"No"。(三角形的面积大于0)。Inp......
  • 最大子矩阵和问题 动态规划 51nod1051
    1051 最大子矩阵和基准时间限制:2 秒空间限制:131072 KB分值: 40 难度:4级算法题例如:3*3的矩阵:-13-12-13-312和最大的子矩阵是:3-1-1312Input......
  • 51nod---无法表示的数
    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1176题意:z=(x/2)取整后+y+xy,x,y都是大于0的整数。即:x,y取不同的数,z可能有多种表示方式,也可能一种都没有,比如3,15就无法用任何x,y来表示。现在将所有无法表示的数排个序,组成一个序列S,给出一个整数n,你来求S[n......
  • 2022.11.23 51nod 图论专场?
    A反转Dag图:题面给出一个\(n\)个点\(m\)条边的有向图,顶点编号\(1\)到\(n\),边的编号为\(1\)到\(m\)。你可以选择一些边进行反转(即从\(u\)到\(v\)的边反转后变为从\(v\)到\(u\)的边),将每条边反转都需要一定代价。最终使得整个图变成一个\(Dag\)图。总的反......
  • 51nod 1227 平均最小公倍数 题解
    题目大意\[A(n)=\frac{1}{n}\sum_{i=1}^{n}\text{lcm}(n,i)\\F(a,b)=\sum_{i=a}^{b}A(i)\\\]给定\(a,b\),求\(F(a,b)\mod10^9+7\)。\(1\lea\leb\le10^9\)。思路首先我们可以想到,如果我们定义\(B(n)=\underset{i=1}{\overset{n}{\sum}}A(i)\),那么\(F(a,......
  • 51nod 1365 Fib(N) mod Fib(K)-题解
    51nod1365Fib(N)modFib(K)个人评价:考一些奇奇怪怪的知识点呢算法矩阵快速幂、斐波那契公式题面求\(F_n\%F_k\)的值,\(1\leqn,k\leq1e18\)问题分析我一开始居然想着直接矩阵快速幂求出两个值算,我也是真的牛……我们要知道这些斐波那契公式(考的真怪)\[F_{-n}=(-1)^{n......
  • 51nod 1242 斐波那契数列的第N项(矩阵快速幂)
    1242 斐波那契数列的第N项基准时间限制:1 秒空间限制:131072 KB分值: 0 难度:基础题 收藏 关注斐波那契数列的定义如下:F(0)=0F(1)=1F(n)=F(n-1)+F(n-2)(n>=2)(1,1,2......