魔法物品(magic.pas/c/cpp)
有两种类型的物品:普通物品和魔法物品。普通物品没有魔法属性,而魔法物品拥有一些魔法属性。每种普通物品有一个价值P,但每种魔法物品有两种价值:鉴定前的价值P。和鉴定后的价值P2(当然,P2总是大于P。)。
为了鉴定一个魔法物品,你需要购买一个鉴定卷轴,用它来鉴定魔法物品。鉴定完一件魔法物品以后,鉴定卷轴便会消失。每个鉴定将会消耗Pi元钱,如果没有足够的钱,你将无法购买任何鉴定卷轴。
现在,你正在一个集市中,同时拥有很多物品。你知道每件物品的价值并且想要出售全部物品。那么,你最多能够获得多少钱呢?
你可以假定:
★开始的时候你没有钱。
★所有的魔法物品都还没有被鉴定。
★只要你有足够的钱,你可以购买任意多的鉴定卷轴。
输入magic.in
第一行有两个整数N和Pi(0<Pi≤5000),表示你拥有的物品数和一个鉴定卷轴价格。
接下来N行,每行给出一件物品的价格。
对于每件普通物品,那一行仅有一个整数P(0<P≤10000)。
对于每件魔法物品,那一行将会有两个整数P1和P2(0<P1<P2≤10000)。
输出magic.out
一个整数表示你最多能够获得多少钱。
样倒输入
2 10
10
20 100
样例输出
100
数据规模
对于30%的数据N≤50;
对于100%的数据N≤1000。
[解析]:对于题目中的普通物品和鉴定前价格加上鉴定费用大于等于鉴定后价格的物品可以直接卖掉。对于剩下的物品,只要能够买得起一个鉴定卷轴就可以把所有的物品都鉴定完。 那么问题就转化为用最小的损失凑足一个鉴定卷轴的钱,直接01背包即可。
参考程序
Var p1,p2,f : array [..]of longint;
c:array[..]of boolean;
n,k,pi,i,j,sum,ss:longint;
begin
assign (input,'magic.in'); reset(input);
assign(output,'magic.out');rewrite(output);
readln(n,pi);
for i:= to n do begin
read(p1[i]);
inc(ss,p1[i]);
if not eoln then begin
readln(p2[i]);
p2[i]:=p2[i]-Pi-p1[i];
if p2[i]> then inc(sum,p2[i]+p1[i])
else begin
p2[i]:=;inc(sum,p1[i]);
end;
end
else begin
readln;
inc(sum,p1[i]);
end;
end;
c[]:=true;
for i:= to pi do f[i]:=maxlongint;
if ss<pi then begin
writeln(ss);
Close(output);halt;
end;
for j:= to n do for i:=pi- downto do
if c[i] then begin
k:=i+p1[j];
if k>pi then k:=Pi;
if f[i]+p2[j]<f[k] then begin
f[k]:=f[i]+p2[j];C[k]:=true;
end;
end;
writeln(sum-f[pi]);
close(output);
end.
考试时错误的算法:
var
n,p,i,j,kongge,money,m,n1,ans:longint;
p1,p2:array[..] of longint;
s:array[..] of string;
f:array[..,..] of longint;
function max(x,y:longint):longint;
begin
max:=x;
if x<y then max:=y;
end;
begin
assign(input,'magic.in');
reset(input);
assign(output,'magic.out');
rewrite(output);
n1:=;
readln(n,p);
for i:= to n do
begin
readln(s[i]);
kongge:=pos(' ',s[i]);
if kongge= then
begin
val(s[i],money);
inc(m,money);
end
else begin
inc(n1);
val(copy(s[i],,kongge-),p1[n1]);
val(copy(s[i],kongge+,),p2[n1]);
end;
end;
ans:=;
for i:= to do f[,i]:=m;
for i:= to n1 do
for j:= to do
begin
if f[i-,j+]-p>= then
f[i,j]:=max(f[i-,j+]-p+p2[i],f[i-,j]+p1[i]);
if f[i,j]>ans then ans:=f[i,j];
end;
writeln(ans);
close(input);
close(output);
end.
魔法物品(magic.pas/c/cpp)的更多相关文章
- NOIP第二次模拟赛 stage1【划分数列(seq.pas/c/cpp)
7划分数列(seq.pas/c/cpp) [题目描述] 给你一个有n个元素的数列,要求把它划分成k段,使每段元素和的最大值最小 [输入格式] 第一行两个正整数n,k 第二行为此数列ai [输出格式] ...
- U68641 划水(swim.pas/c/cpp)
U68641 划水(swim.pas/c/cpp) 题目背景 小小迪带你划水. 题目描述 原题 输入输出格式 输入格式: 第一行一个数 T. 接下来 T 行每行一个数表示 n 输出格式: 输出 T 行 ...
- 纪中5日T3 1566. 幸运锁(lucky.pas/c/cpp)
1566. 幸运锁(lucky.pas/c/cpp) 题目描述 有一把幸运锁,打开它将会给你带来好运,但开锁时需要输入一个正整数(没有前导0).幸运锁有一种运算,对于一个正整数,返回他的相邻两位数字间 ...
- EX14 彩票中奖 (lottery.pas/c/cpp)
[题目描述]小明想试试运气去购买彩票,所以他开始研究彩票大乐透的玩法:超级大乐透是指由购买者从01—35共35个号码中选取5个号码为前区号码,并从01—12共12个号码中选取2个号码为后区号码组合为一 ...
- QQ 数(number.pas/c/cpp)——莫比乌斯函数
题目 [问题描述] 企鹅国数学家 QQ 潜心研究数论,终于发现了一个简单的数论问题! 一个 QQ 数定义为一个拥有一个大于 $ 1 $ 的完全平方数为因子的数字,一个数字的 QQ 值定义为这个数是 Q ...
- 【提高组NOIP2008】双栈排序 (twostack.pas/c/cpp)
[题目描述] Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈 ...
- 浅谈分治算法在OI中的应用
分治虽然是基本思想,但是OI中不会出裸分治让你一眼看出来,往往都是结合到找规律里面. 先来个简单的: 奇妙变换 (magic.pas/c/cpp) [问题描述] 为了奖励牛牛同学帮妈妈解决了大写中 ...
- noip模拟赛(一)魔法树
魔法树 (mahou.pas/c/cpp) [问题描述] 魔法使moreD在研究一棵魔法树. 魔法树顾名思义,这货是一棵树,奇葩的是魔法树上的每一条边都拥有一个魔法属性,如果不那么奇葩就不是moreD ...
- TYVJ P3407 佳佳的魔法照片 Label:语文很重要 语文很重要 语文很重要
描述 佳佳的魔法照片(mphoto.pas\c\cpp) [题目背景] 佳佳的魔法照片(Magic Photo):如果你看过<哈利•波特>,你就会知道魔法世界里的照片是很神奇的.也许是因为 ...
随机推荐
- JS小数运算失精度的问题
JS因为是解释性语言,在运算中会有丢失精度的问题,这种现象多出现在浮点型运算的情况下. 例如 5.11 * 100 得到的结果是 511.00000000000006 这种情况尤其是在处理金额的时候 ...
- bootstrap Table动态绑定数据并自定义字段显示值
第一步:我们在官网下载了bootstrap 的文档,并在项目中引入bootstrap table相关js文件,当然,也要记得引入jquery文件 大概如图: 第二步:定义一个table控件 第三步:j ...
- 批处理,%~d0 cd %~dp0 代表什么意思
批处理,%~d0 cd %~dp0 代表什么意思 ~dp0 “d”为Drive的缩写,即为驱动器,磁盘.“p”为Path缩写,即为路径,目录cd是转到这个目录,不过我觉得cd /d %~dp0 还 ...
- 吐血分享:QQ群霸屏技术教程2017(问题篇)
霸屏技术,问题篇后,暂时搁置,尔望后续. 这里针对操作中,经常遇到的问题,做个简单整理. 回忆下,排名流程. 1.建群,品牌产品群,做任何关键词都是品牌产品群,皆因其有独特的优势. 2.拉人,填充群人 ...
- ECSHOP和SHOPEX快递单号查询韵达插件V8.6专版
发布ECSHOP说明: ECSHOP快递物流单号查询插件特色 本ECSHOP快递物流单号跟踪插件提供国内外近2000家快递物流订单单号查询服务例如申通快递.顺丰快递.圆通快递.EMS快递.汇通快递.宅 ...
- JavaSE 第二次学习随笔(二)
循环结构中的多层嵌套跳出 targeta: for(int i = 0; i < 100; i++){ for (int j = 0; j < 100; j++) { if(i + j = ...
- CentOS 同步时间的方法
与时间服务器上的时间同步的方法 1. 安装ntpdate工具 # yum -y install ntp ntpdate 2. 设置系统时间与网络时间同步 # ntpdate cn.pool.ntp ...
- SpringMVC+Mybatis框架搭建
一.新建javaweb项目,并建好相应的包结构 二.添加项目jar到lib目录下 三.在config包中新建配置文件 sping-mvc.xml,内容如下: <?xml version=&quo ...
- (译)JavaScript 中的正则表达式(RegEx)实操——快速掌握正则表达式,伴有随手可练的例子————(翻译未完待续)
(原文:https://blog.bitsrc.io/a-beginners-guide-to-regular-expressions-regex-in-javascript-9c58feb27eb4 ...
- R语言绘图:ROC曲线图
使用pROC包绘制ROC曲线 #####***绘制ROC曲线***##### library("pROC") N <- dim(data2)[1] #数据长度 set.see ...