有两种类型的物品:普通物品和魔法物品。普通物品没有魔法属性,而魔法物品拥有一些魔法属性。每种普通物品有一个价值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)的更多相关文章

  1. NOIP第二次模拟赛 stage1【划分数列(seq.pas/c/cpp)

    7划分数列(seq.pas/c/cpp) [题目描述] 给你一个有n个元素的数列,要求把它划分成k段,使每段元素和的最大值最小 [输入格式] 第一行两个正整数n,k 第二行为此数列ai [输出格式] ...

  2. U68641 划水(swim.pas/c/cpp)

    U68641 划水(swim.pas/c/cpp) 题目背景 小小迪带你划水. 题目描述 原题 输入输出格式 输入格式: 第一行一个数 T. 接下来 T 行每行一个数表示 n 输出格式: 输出 T 行 ...

  3. 纪中5日T3 1566. 幸运锁(lucky.pas/c/cpp)

    1566. 幸运锁(lucky.pas/c/cpp) 题目描述 有一把幸运锁,打开它将会给你带来好运,但开锁时需要输入一个正整数(没有前导0).幸运锁有一种运算,对于一个正整数,返回他的相邻两位数字间 ...

  4. EX14 彩票中奖 (lottery.pas/c/cpp)

    [题目描述]小明想试试运气去购买彩票,所以他开始研究彩票大乐透的玩法:超级大乐透是指由购买者从01—35共35个号码中选取5个号码为前区号码,并从01—12共12个号码中选取2个号码为后区号码组合为一 ...

  5. QQ 数(number.pas/c/cpp)——莫比乌斯函数

    题目 [问题描述] 企鹅国数学家 QQ 潜心研究数论,终于发现了一个简单的数论问题! 一个 QQ 数定义为一个拥有一个大于 $ 1 $ 的完全平方数为因子的数字,一个数字的 QQ 值定义为这个数是 Q ...

  6. 【提高组NOIP2008】双栈排序 (twostack.pas/c/cpp)

    [题目描述] Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈 ...

  7. 浅谈分治算法在OI中的应用

    分治虽然是基本思想,但是OI中不会出裸分治让你一眼看出来,往往都是结合到找规律里面. 先来个简单的: 奇妙变换 (magic.pas/c/cpp) [问题描述]   为了奖励牛牛同学帮妈妈解决了大写中 ...

  8. noip模拟赛(一)魔法树

    魔法树 (mahou.pas/c/cpp) [问题描述] 魔法使moreD在研究一棵魔法树. 魔法树顾名思义,这货是一棵树,奇葩的是魔法树上的每一条边都拥有一个魔法属性,如果不那么奇葩就不是moreD ...

  9. TYVJ P3407 佳佳的魔法照片 Label:语文很重要 语文很重要 语文很重要

    描述 佳佳的魔法照片(mphoto.pas\c\cpp) [题目背景] 佳佳的魔法照片(Magic Photo):如果你看过<哈利•波特>,你就会知道魔法世界里的照片是很神奇的.也许是因为 ...

随机推荐

  1. vuex重置所有state(可定制)

    在正式场景中我们经常遇到一个问题,就是登出页面或其他操作的时候,我们需要重置所有的vuex,让其变为初始状态,那么,就涉及到了多种方法:1.页面刷新: window.location.reload() ...

  2. Discuz论坛搜索下拉框插件openSug

    Discuz!只需安装openSug插件即可获得带有“搜索框提示”功能的搜索框,让您的Discuz搜索更便捷! 下载:https://www.opensug.org/faq/.../opensug.d ...

  3. go web处理上传

    要使表单能够上传文件,第一步就是添加form的enctype属性,enctype属性有如下三种情况: application/x-www-form-urlencoded 表示在发送前编码所有字符(默认 ...

  4. kafka集群部署文档(转载)

    原文链接:http://www.cnblogs.com/luotianshuai/p/5206662.html Kafka初识 1.Kafka使用背景 在我们大量使用分布式数据库.分布式计算集群的时候 ...

  5. C#基础--之数据类型【转】

    在第一章我们了解了C#的输入.输出语句后,我这一节主要是介绍C#的基础知识,本节的内容也是后续章节的基础,好的开端等于成功的一半.在你阅读完本章后,你就有足够的C#知识编写简单的程序了.但还不能使用继 ...

  6. hihoCoder 1175:拓扑排序二

    题目链接: http://hihocoder.com/problemset/problem/1175 题目难度:一星级(简单题) 今天闲来无事,决定刷一道水题.结果发现这道水题居然把我卡了将近一个钟头 ...

  7. python3.6 新特性学习

    #支持类型提示 typing { def greeting(name: str) -> str: return 'Hello ' + name #在函数greeting中,参数名称的类型为str ...

  8. 阿里的100TB Sort Benchmark排序比雅虎快了一倍还多,我的看法

    如果我的判断正确,它们使用的软件和算法应该是HADOOP,MAP/REDUCE,或者类似的技术方案.如果这些条件一样,影响计算结果的还有三个因素: 1.CPU的数量和CPU的处理能力     CPU的 ...

  9. VM实例的生命周期管理

    有的操作功能比较类似,也有各自的适用场景,简单介绍下上述几个重要的操作: 常规操作: 常规操作中,Launch.Start.Reboot.Shut Off 和 Terminate 都很好理解. 下面几 ...

  10. 安装配置hadoop

    在master中安装并且配置hadoop (1).将hadoop-2.6.4.tar.gz安装包复制到hadoop文件目录下(直接赋值进去就行) (2).解压安装包haoddp-2.6.4.tar.g ...