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表示编 ...
随机推荐
- Python学习路线2019升级版(课程大纲+视频教程+网盘资源下载)
2019最新Python全栈+人工智能学习路线升级版 全面涵盖前端.后端.爬虫.数据挖掘.人工智能等课程(课程大纲+视频教程+网盘资源下载)! 学习路线四大亮点: 1.人工智能三大主流框架全覆盖 2. ...
- oracle给用户授权存储过程
https://www.jianshu.com/p/fab356d68ae2 grant connect,resource to xinomonitor; 发现不能进行断点调试,然后授如下权限 gra ...
- ASCII,UTF-8,Unicode字符串相互转换
#include<string> #include<windows.h> #include<vector> using namespace std; //utf8 ...
- PHP即时实时输出内容
一般情况下,PHP都是将整个页面全部执行完成后,才会把要输出的内容发送回客户端. for ($i = 0; $i < 10; $i++) { echo $i; sleep(1); } 这段代码会 ...
- python之(urllib、urllib2、lxml、Selenium+PhantomJS)爬虫
一.最近在学习网络爬虫的东西,说实话,没有怎么写过爬虫,Java里面使用的爬虫也没有怎么用过.这里主要是学习Python的时候,了解到Python爬虫的强大,和代码的简介,这里会简单的从入门看是说起, ...
- 扩展支持全选的CheckBox列。
扩展支持全选的CheckBox列. https://www.codeproject.com/articles/42437/toggling-the-states-of-all-checkboxes-i ...
- cmake简单用法
CMake是一个跨平台的编译工具,类似于automake 安装 # cd cmake-2.8.10.2 # ./bootstrap # make # make install project proj ...
- hive四种排序
order by order by 会对输入做全局排序,因此只有一个reducer(多个reducer无法保证全局有序)只有一个reducer,会导致当输入规模较大时,需要较长的计算时间. set h ...
- C++——多态性 与 虚函数
多态性 多态性是面向对象程序设计的关键技术之一.若程序设计语言不支持多态性,不能称为面向对象的语言.利用多态性技术,可以调用同一个函数名的函数,实现完全不同的功能. 多态性(polymorphism) ...
- LInux CentOS7 vsftpd 配置注释
本文首发: https://www.somata.work/2019/LinuxCentOSvsftpdConfigComment.html vsftpd.conf anonymous_enable= ...