题目描述

//又是一个好(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 魔法物品的更多相关文章

  1. 魔法物品(magic.pas/c/cpp)

    有两种类型的物品:普通物品和魔法物品.普通物品没有魔法属性,而魔法物品拥有一些魔法属性.每种普通物品有一个价值P,但每种魔法物品有两种价值:鉴定前的价值P.和鉴定后的价值P2(当然,P2总是大于P.) ...

  2. 【t073】&&【t015】魔法物品

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 有两种类型的物品:普通物品和魔法物品.每种普通物品有一个价值P,但每种魔法物品有两种价值:鉴定前的价值 ...

  3. Phaser开源2d引擎 javascript/html5游戏框架

    功能特点(Features) 易维护代码(Easy Asset Loading) Phaser可以加载图片,音频文件,数据文件,文本文件和自动解析精灵图和纹理地图集数据(出口纹理封隔器或Flash C ...

  4. akoj-1140-英雄联盟阵营

    英雄联盟阵营 Time Limit:1000MS  Memory Limit:65536KTotal Submit:54 Accepted:16 Description 符文之地——瓦罗兰,作为最大的 ...

  5. NOIP2016游记(非题解)

    去年的比赛现在来发是不是晚了. -------------------------------- Day1-白天 出发啦, 动车购票处一群丧病的又在玩售票机 动车上看到胡神打苍蝇 苍蝇打苍蝇 在车上颓 ...

  6. entity framework core 支持批量插入,值得期待

    entity framework6.x之前搞了这么多版本,构架这么牛B,居然没有批量插入更新的功能,但有很多替换的解决方案,例如Entity Framework Extended Library(ht ...

  7. 洛谷 P2119 魔法阵

    题目描述 六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法能量. 大魔法师有mm个魔法物品,编号分别为1,2,...,m1,2,...,m.每个物品具有一个魔法值,我们用X_iXi ...

  8. [luogu2119]魔法阵 NOIP2016T4

    很好的一道数学推导题 45分做法 $O(N^4)$暴力枚举四个材料 55分做法 从第一个约束条件可得到所有可行答案都是单调递增的,所以可以排序一遍,减少枚举量,可以拿到55分 100分做法 首先可以发 ...

  9. 洛谷P2119 魔法阵

    P2119 魔法阵 题目描述 六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法能量. 大魔法师有m个魔法物品,编号分别为1,2,...,m.每个物品具有一个魔法值,我们用Xi表示编 ...

随机推荐

  1. 理解javascript中的立即执行函数(function(){})()(转)

    原文:https://www.cnblogs.com/yanzp/p/6371292.html

  2. C# 泛型集合排序

    Student sModel = new Student(); List<Student > list = new List<Student >(); list= list.O ...

  3. ES6中 对字符串增强

    在曾经,我们只能用A.indexof(B)来判断A中是否含有B字符串: 现在在ES6中 有了: includes(), startswith(),endswith() reapt()重复次数: 输出 ...

  4. js中的BOM和DOM常用事件方法

    笔记: window对象 ● window.innerHeight - 浏览器窗口的内部高度 ● window.innerWidth - 浏览器窗口的内部宽度 ● window.open() - 打开 ...

  5. How to delete SAP* from HANA Tenant database

    How to delete SAP* from HANA Tenant database 1.如何登录HANA的多租户(TDC)数据库 使用SAPS4端对应的SAP账户,比如S4D的账户为s4dadm ...

  6. hive分区理念介绍

    一.背景 1.在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据,因此建表时引入了partition概念. 2.分区表指的是在创建表 ...

  7. Feign报错'xx.FeignClientSpecification', defined in null, could not be registered.

    解决: 在application.yml中配置: spring: main: allow-bean-definition-overriding: true 参考:https://blog.csdn.n ...

  8. Vue指令之`v-for`和`key`属性

    2.2.0+ 的版本里,**当在组件中使用** v-for 时,key 现在是必须的. 当 Vue.js 用 v-for 正在更新已渲染过的元素列表时,它默认用 “**就地复用**” 策略.如果数据项 ...

  9. ubuntu18.04 下启动Android Studio报错KVM is required to run this AVD. /dev/kvm device: permission denied.

    在ubuntu18.04下安装Android Studio,安装了模拟器后运行报错 KVM is required to run this AVD. /dev/kvm device: permissi ...

  10. Oracle死锁处理实例

    Oracle死锁常规语句 1.查询Oracle死锁常规语句 SELECT l.session_id sid, s.serial#, l.locked_mode,l.oracle_username, l ...