消灭兔子

2024-02-06 19:32
文章标签 兔子 消灭

本文主要是介绍消灭兔子,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

消灭兔子
Problem : 1009
Time Limit : 1000ms
Memory Limit : 65536K
description
有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”。
sample_input
3 3
1
2
3
2 1
3 2
4 3
sample_output
6
hint
source
51nod点头网

这题目分析是贪心,但是我一开始想着按照箭的价值从小到大排序了,然后将血量从小到大排序,然后从价值小到大枚举所有箭,(二分答案(未用)),就是尽量让箭的伤害刚好大于兔子的血量,但是这样如何判断全部兔子杀死了,如果每次轮询,结果超时。

//TLE:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int b[60000],flag[60000];struct jian
{int x;int y;
}a[60000];int cmp(const jian &a,const jian &b)
{if(a.y==b.y)return a.x<b.x;elsereturn a.y<b.y;
}int main()
{int n,m;while(scanf("%d%d",&n,&m)==2){memset(flag,0,sizeof(flag));for(int i=0;i<n;i++)scanf("%d",&b[i]);for(int i=0;i<m;i++)scanf("%d%d",&a[i].x,&a[i].y);sort(a,a+m,cmp);sort(b,b+n);if(n>m)printf("No Solution\n");else{int sum=0;for(int i=0;i<m;i++){for(int j=n-1;j>=0;j--)if(flag[j]==0&&a[i].x>=b[j]){sum+=a[i].y;flag[j]=1;break;}}int fl=0;for(int j=0;j<n;j++){fl+=flag[j];}if(fl>=n)printf("%d\n",sum);elseprintf("No Solution\n");}}
}

`
后来看标程将所有兔子血量从大到小,以及伤害从大到小排序,这样对于每一只兔子可能有几只能够杀死他的箭,选择价值最小的那一个将他杀死即可,然后用当前能够杀死第二只兔子的所有箭中价值最小的去杀死第二只。。。。直到有一只兔子没有箭能够杀死他,或者把所有兔子全部杀死。这里要用到优先队列。
就是枚举所有兔子,将大于第一只兔子的所有箭入队列,并且按照价值从小到大,然后取出最小的杀死第一只,然后将箭伤害大于第二只兔子的所有箭入队列,当然队列里面还有能够杀死第一只兔子的箭,然后选择最小价值杀死第二只,直到队列空或者全部杀死,这样处理起来要比我那种方案方便多了。

#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;  }  else  cout << "No Solution"<< endl;  }  return 0;  
}  

这篇关于消灭兔子的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/685324

相关文章

不撸兔子:用rust刷题

一个被rust耽误的相声演员。 ppt做得很棒。工作也很棒。可惜讲得太快太风趣,导致小编往了拍照和记录。:) 那就等后面的录像吧。 公众号一次只能推 8 篇,更多的,明天再推咯。

Android热修复——Dex注入实现静默消灭bug

当app上线后发现紧急bug,如果重新发布版本周期比较长,并且对用户体验不好,此时热修复就派上用场了。热修复就是为紧急bug而生,能够快速修复bug,并且用户无感知。针对热修复,阿里系先后推出AndFix、HotFix、SophFix,腾讯系也推出QQ空间超级补丁、微信Tinker。在这里,主要讨论是注入dex实现热修复。         注入dex的前提是需要dex分包,这里使

6招助你消灭“火锅综合症

如果在火锅的食物搭配上下些工夫,就可以尽量减少症状的产生。现介绍几种方法:  1. 多放些蔬菜 火锅佐料不仅有肉、鱼及动物内脏等食物,还必须放入较多的蔬菜。蔬菜含大量维生素及叶绿素,其性多偏寒凉,不仅能消除油腻,补充人体维生素的不足,还有清凉、解毒、去火的作用,但放入的蔬菜不要久煮,才有消火作用。  2. 适量放些豆腐 豆腐是含有石膏的一种豆制品,在火锅内适当放入豆腐,不仅能补充多种微量元

我的第一个Python项目--你好兔子

不知道Python能做什么,看基础语法没动力,找项目玩一玩了解下Python能做什么 12岁的少年教你用Python做小游戏 好吧,就从这个开始。 看看需要准备什么 1、开发环境 1、需要Python 2.72、需要pygame 模块 2.7就算了,刚装好的3.7,应该差不多 继续安装pygame Mac 安装Pygame小记 pip install pygame OK,安装好了,继

【三】【算法分析与设计】第三届程序设计竞赛部分题目,竖式加法,竖式乘法,求序列差最大,小红的字符串,再编号,消灭飞龙,世界五子棋

竖式加法 链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目描述 小红对简单的加法很在行。 她想知道对于一个正整数A,她需要找到一个最小的正整数B,以确保A+B会产生进位。 输入描述: 输入共 T+1 行。 第一行一个整数表示 T组数据(1≤T≤10^5) 接下来T行,每行一个整数表示A(1≤A≤10^8) 输出描述: 输出共T行,表示最小的正整数B 示例1 输入 3 1145

C语言试题八十六之兔子生兔子问题

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目        假设一对兔子的成熟期是一个月,即一个月可长成成兔,那么,如果每对成兔每个月都生一对小兔,

[数据集][目标检测]红外兔子检测数据集VOC+YOLO格式96张1类别

数据集格式:Pascal VOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):96 标注数量(xml文件个数):96 标注数量(txt文件个数):96 标注类别数:1 标注类别名称:["rat"] 每个类别标注的框数: rat 框数 = 378 总框数:378 使用标注工具:labelImg

网课:第二章模拟、枚举与贪心---兔子的区间密码

链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网   题目描述 有一只可爱的兔子被困在了密室了,密室里有两个数字,还有一行字: 只有解开密码,才能够出去。 可爱的兔子摸索了好久,发现密室里的两个数字是表示的是一个区间[L,R] 而密码是这个区间中任意选择两个(可以相同的)整数后异或的最大值。 比如给了区间[2,5] 那么就有2 3 4 5这些数,其中 2 xor 5=7最大 所以密码

(50道编程题)兔子生兔子 php

题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一 对兔子,假如兔子都不死,问每个月的兔子总数为多少?  1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....  <?php function func(){ $a = 1; $b = 1; $c = 0; for($i=1;$i<12;$i++){ $a = $b; $b

【C/C++笔试练习】DNS劫持、三次握手、TCP协议、HTTPS、四次挥手、HTTP报文、拥塞窗口、POP3协议、UDP协议、收件人列表、养兔子

文章目录 C/C++笔试练习选择部分(1)DNS劫持(2)三次握手(3)TCP协议(4)HTTPS(5)四次挥手(6)HTTP报文(7)拥塞窗口(8)POP3协议(9)UDP协议(10)TCP协议 编程题 day34收件人列表养兔子 C/C++笔试练习 选择部分 (1)DNS劫持   上网的时候,访问某个网页却突然出现了某个运营商的网页(如联通、电信)。出现此问题可能的原因