P1899 魔法物品
题目描述
//又是一个好(nan)题好(nan)题
//首先,普通物品一开始就卖掉就可以,因为它不会增值
//至于魔法物品
//如果一个魔法物品使用了卷轴后的价值减去买卷轴的钱还不如鉴定前的价值高,那么我们鉴定这个魔法物品是要亏本的
//这样的魔法物品我们把它称为假的魔法物品,当成普通物品处理就好
//否则如果鉴定之后可以赚钱,就把它称之为真的魔法物品 //后边怎么体现买了卷轴的时候有点绕,其实看看算魔法药品利润的那个式子就很好理解了 #include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<sstream>
using namespace std; const int N=;
const int M=1e7+; int n,P;
int allv,v;
//allv是所有魔法物品鉴定前和普通物品的价值的和, v是普通物品的价值和,是初始资金
int dp[M];
//dp[i]表示通过卖魔法物品得到i元钱所赔的最小利润的和
int mf,p1[N],profit[N];
//mf是真真的魔法物品的数量,p1是是鉴定前的价值,profit是鉴定后能获取的利润 int main()
{
string S;
scanf("%d%d",&n,&P);
getline(cin,S); //一定要用getline读换行,不要用getchar()
for(int i=;i<=n;++i)
{
stringstream s; //字符串流黑科技,不懂的百度
getline(cin,S); //读入这一行的内容
s<<S; //将字符串S转化成一个流字符串
int a,b;
s>>a; //第一个价值
allv+=a;
if(s>>b&&b-P-a>) //如果这是个真的魔法物品 s>>b表示这一行还有第二个数字,b-P-a>0表示鉴定之后能获得利润
{
++mf;
p1[mf]=a; //鉴定前价值
profit[mf]=b-P-a; //鉴定后价值
}
else //假的魔法物品,当成普通物品处理
v+=a;
}
// cout<<allv<<" "<<v;
if(v<P) //手中卖掉普通物品后的初始资金不够买卷轴
{
for(int i=;i<=allv-v;++i) //卖掉鉴定前的真的魔法物品最多可以获得allv-v元钱
dp[i]=;
for(int i=;i<=mf;++i) //枚举魔法物品个数
{
for(int j=allv-v;j>=p1[i];--j) //卖魔法药品得到j元钱要损失多少利益
{
dp[j]=min(dp[j],dp[j-p1[i]]+profit[i]); //求最少损失
}
}
int minn=;
for(int i=P-v;i<=allv-v;++i) //找最小损失 i=P-v是因为我们最少需要P-v元钱就可以买卷轴
minn=min(minn,dp[i]);
if(minn==) //卖完所有的魔法药品仍然买不了卷轴,那么只能全部按鉴定前价格出售
printf("%d",allv);
else //能买卷轴了
{
for(int i=;i<=mf;++i) //加上鉴定后能获得的的利润
allv+=profit[i];
printf("%d",allv-minn); //要减掉卖魔法物品的利润损失
}
}
else //不卖魔法药品就能买卷轴
{
for(int i=;i<=mf;++i) //加上利润
allv+=profit[i];
printf("%d",allv);
}
return ;
}
一种做法
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std; int n,p,x,y,sum1,sum2,sum3; //sum1是普通物品的价值和,sum2是真魔法物品鉴定前的价值和,sum3是真魔法物品鉴定后可以获得的利润和
int dp[]; //dp[i]表示花0->i元钱可以获得的最大利润
char c;
struct THI
{
int x,v;
THI(int x=,int v=):x(x),v(v){}
};
vector<THI> vec; //真·魔法物品 int main()
{
scanf("%d%d",&n,&p);
for(int i=;i<=n;i++)
{
scanf("%d",&x);
if(c=getchar()==' ')
{
scanf("%d",&y);
if(y-x<=p) sum1+=x;
else sum2+=x,sum3+=y-x-p,vec.push_back(THI(x,y-x-p));
}
else sum1+=x;
}
if(sum1>=p) //初始资产能买到卷轴
{
printf("%d",sum1+sum2+sum3); //初始资产+魔法物品鉴定前价值和+鉴定后利润和
return ;
}
if(sum1+sum2<=p) //把普通物品和魔法物品全卖了也买不到卷轴
{
printf("%d",sum1+sum2); //那就全卖了吧
return ;
}
for(int i=;i<vec.size();i++) //找最大利润
for(int j=sum1+sum2-p;j>=vec[i].x;j--)
dp[j]=max(dp[j],dp[j-vec[i].x]+vec[i].v);
printf("%d",sum1+sum2+dp[sum1+sum2-p]);
return ;
}
也是一种做法
P1899 魔法物品的更多相关文章
- 魔法物品(magic.pas/c/cpp)
有两种类型的物品:普通物品和魔法物品.普通物品没有魔法属性,而魔法物品拥有一些魔法属性.每种普通物品有一个价值P,但每种魔法物品有两种价值:鉴定前的价值P.和鉴定后的价值P2(当然,P2总是大于P.) ...
- 【t073】&&【t015】魔法物品
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 有两种类型的物品:普通物品和魔法物品.每种普通物品有一个价值P,但每种魔法物品有两种价值:鉴定前的价值 ...
- Phaser开源2d引擎 javascript/html5游戏框架
功能特点(Features) 易维护代码(Easy Asset Loading) Phaser可以加载图片,音频文件,数据文件,文本文件和自动解析精灵图和纹理地图集数据(出口纹理封隔器或Flash C ...
- akoj-1140-英雄联盟阵营
英雄联盟阵营 Time Limit:1000MS Memory Limit:65536KTotal Submit:54 Accepted:16 Description 符文之地——瓦罗兰,作为最大的 ...
- NOIP2016游记(非题解)
去年的比赛现在来发是不是晚了. -------------------------------- Day1-白天 出发啦, 动车购票处一群丧病的又在玩售票机 动车上看到胡神打苍蝇 苍蝇打苍蝇 在车上颓 ...
- entity framework core 支持批量插入,值得期待
entity framework6.x之前搞了这么多版本,构架这么牛B,居然没有批量插入更新的功能,但有很多替换的解决方案,例如Entity Framework Extended Library(ht ...
- 洛谷 P2119 魔法阵
题目描述 六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法能量. 大魔法师有mm个魔法物品,编号分别为1,2,...,m1,2,...,m.每个物品具有一个魔法值,我们用X_iXi ...
- [luogu2119]魔法阵 NOIP2016T4
很好的一道数学推导题 45分做法 $O(N^4)$暴力枚举四个材料 55分做法 从第一个约束条件可得到所有可行答案都是单调递增的,所以可以排序一遍,减少枚举量,可以拿到55分 100分做法 首先可以发 ...
- 洛谷P2119 魔法阵
P2119 魔法阵 题目描述 六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法能量. 大魔法师有m个魔法物品,编号分别为1,2,...,m.每个物品具有一个魔法值,我们用Xi表示编 ...
随机推荐
- Docker 学习笔记(二):Dockerfile 定制镜像
镜像的定制实际上就是定制每一层所添加的配置.文件. 如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那么之前提及的无法重复的问题.镜像构建透明性的问题.体积 ...
- 写一个RD一般需要多久?在迭代中新增的需求如何处理?如何做好项目管理?
最近总是有些初入行的小伙们,经常会问我一些他们在工作工作的中疑问,我今天挑选出几个比较典型的问题和大家一起来讨论下. 问题如下: 写一个PRD一般需要多久? 在迭代中新增的需求如何处理? 如何做好项目 ...
- 在论坛中出现的比较难的sql问题:17(字符分拆2)
原文:在论坛中出现的比较难的sql问题:17(字符分拆2) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有必要记录下来 ...
- R_数据视觉化处理_初阶_02
通过数据创建一幅简单的图像, #Crate a easy photopdf("mygraph.pdf") attach(mtcars) plot(wt,mpg) abline(lm ...
- linux查看日志报错
查看运行时错误: tail -f catalina.out | grep -C 10 'Exception' 10是行数: 单引号里面的是要查找的关键字:
- apache ftp server 设置
<server xmlns="http://mina.apache.org/ftpserver/spring/v1" xmlns:xsi="http://www.w ...
- 详解Linux磁盘管理与文件系统
磁盘基础 硬盘结构 物理结构 盘片:硬盘有多个盘片,每盘片 2 面. 磁头:每面一个磁头. 数据结构 扇区:磁盘上的每个磁道被等分为若干个弧段,这些弧段便是硬盘的扇区. 硬盘的第一个扇区,叫做引导扇区 ...
- Java中实现图片的上传
这边直接存放在c盘的指定目录,在property中指定了一个目录 没有花时间写用户操作的上传页面,直接用swagger2插件,可以上传 默认图片大小超过1mb就不可以上传,可以如下更改 server. ...
- js中的forEach和map的区别
我们先来看两者之间的相同之处 var arr = ['a','b','c','d']; arr.forEach(function(item,index,arr){ //item表示数组中的每一项,in ...
- redis高可用之sentinel哨兵
一,单实例模式 当系统中只有一台redis运行时,一旦该redis挂了,会导致整个系统无法运行. 二,主从模式 由于单台redis出现单点故障,就会导致整个系统不可用,所以想到的办法自然就是备份.当一 ...