题目描述

//又是一个好(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. 【转载】Maven入门实践

    Maven 确确实实是个好东西,用来管理项目显得很方便,但是如果是通过 Maven 来远程下载 JAR 包的话,我宿舍的带宽是4兆的,4个人共用,有时候用 Maven 来远程下载 JAR 包会显得很慢 ...

  2. Android--单选对话框

    import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterfa ...

  3. [Luogu5280][ZJOI2019]线段树(线段树+DP)

    https://www.luogu.org/blog/Sooke/solution-p5280 首先想到对线段树上每个点分别维护有多少棵线段树在它上有标记(f[]),然后想到对于每个操作,根据转移的不 ...

  4. shell 学习笔记2-shell-test

    一.字符串测试表达式 前面一篇介绍:什么是shell,shell变量请参考: shell 学习笔记1-什么是shell,shell变量 1.字符串测试表达式参数 字符串需要用""引 ...

  5. springboot之手动控制事务

    一.事务的重要性,相信在实际开发过程中,都有很深的了解了.但是存在一个问题我们经常在开发的时候一般情况下都是用的注解的方式来进行事务的控制,说白了基于spring的7种事务控制方式来进行事务的之间的协 ...

  6. vs项目模板创建和使用

    一.使用dotnet命令创建(适用于.NET Core,可以创建包含任意数量个项目的模板,但不会出现在vs的新建项目模板中) 官方文档:https://docs.microsoft.com/zh-cn ...

  7. Gogs + Drone 实现CI/CD(CI)

    本文通过docker-compose方式安装运行drone,先将drone的server和agent镜像拉取到本地,这样docker-compose脚本执行速度会快一点.当然,不是必须先拉取drone ...

  8. vue-ueditor-wrap报错,vue ueditor 加载ueditor.config.js失败,请检查您的配置地址UEDITOR_HOME_URL填写是否正确!

    1.第一次报错后,仔细看了官方文档,少了第一步,下载UEditor源码,放到public目录(前提你用的是vue-cli 3.x的版本). 好那就下载,下载的是vue-ueditor-wrap作者修复 ...

  9. 安卓开发之利用runOnUiThread在子线程更新UI

    package com.lidaochen.test; import android.graphics.Bitmap; import android.graphics.BitmapFactory; i ...

  10. Session机制详解及分布式中Session共享解决方案

    一.为什么要产生Session http协议本身是无状态的,客户端只需要向服务器请求下载内容,客户端和服务器都不记录彼此的历史信息,每一次请求都是独立的. 为什么是无状态的呢?因为浏览器与服务器是使用 ...