http://acm.hdu.edu.cn/showproblem.php?pid=3842 (题目链接)

题意

  一个公司使用一个厂房$D$天,希望获利最大。有$n$台机器,每一台可以在第$D_i$天购买,需要支付$P_i$,购买那天以后每一天可以获得$G_i$的收益,将它卖出可以获得$R_i$的收益,问到第$D+1$天的最大收益。

Solution

  直接对天数不好dp,因为$D_i$可能会有重复,我们对机器进行dp。将时间离散化后,给机器按照$D_i$并从小到大排好序后,$f[i]$表示第$i$台机器出售那天的最大获利,那么在这一天可以卖出这段时间正在使用的机器,或者是延续上一天的状态,转移:$$f[i]=max\{f[i-1],f[j]-P[j]+R[j]+G[j]*(D[i]-D[j]-1)\}$$

  条件是$f[j]>=P[j]$,所以:$$X[j]=G[j]$$

$$Y[j]=f[j]-P[j]+R[j]-G[j]*(D[j]+1)$$

$$K=-D[i]$$

  所以我们CDQ一下就好了。

细节

  多个机器的$D_i$相等,但是我们要把他们的处理顺序分开。多组数据注意清空。

代码

// hdu3842
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf (1ll<<30)
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
using namespace std; const int maxn=200010;
int n,m,D,t[maxn],st[maxn],w[maxn];
LL f[maxn];
struct point {LL x,y,t;}p[maxn],np[maxn];
struct data {LL D,P,R,G,k,id;}q[maxn],nq[maxn]; bool cmp(data a,data b) {
return a.k<b.k;
}
double slope(point a,point b) {
return a.x==b.x ? inf*(b.y>a.y ? 1 : -1) : (double)(b.y-a.y)/(double)(b.x-a.x);
}
void solve(int l,int r) {
if (l==r) {
f[l]=max(f[l-1],f[l]);
p[l]=(point){q[l].G,f[l]-q[l].P+q[l].R-q[l].G*(q[l].D+1),f[l]>=q[l].P};
return;
}
int mid=(l+r)>>1,top=0,l1=l,l2=mid+1;
for (int i=l;i<=r;i++) q[i].id<=mid ? nq[l1++]=q[i] : nq[l2++]=q[i];
for (int i=l;i<=r;i++) q[i]=nq[i];
solve(l,mid);
for (int i=l;i<=mid;i++) if (p[i].t) {
while (top>1 && slope(p[st[top-1]],p[st[top]])<slope(p[st[top]],p[i])) top--;
st[++top]=i;
}
for (int i=mid+1;i<=r;i++) {
while (top>1 && slope(p[st[top-1]],p[st[top]])<q[i].k) top--;
int j=st[top];
f[q[i].id]=max(f[q[i].id],p[j].y-q[i].k*p[j].x);
}
solve(mid+1,r);
for (int i=l,j=mid+1,k=l;i<=mid || j<=r;) {
if (j>r || (i<=mid && p[i].x<p[j].x)) np[k++]=p[i++];
else np[k++]=p[j++];
}
for (int i=l;i<=r;i++) p[i]=np[i];
}
int main() {
int T=0;
while (scanf("%d%lld%d",&n,&f[0],&D)!=EOF) {
if (!n && !f[0] && !D) break;
for (int i=1;i<=n;i++) {
scanf("%lld%lld%lld%lld",&q[i].D,&q[i].P,&q[i].R,&q[i].G);
t[i]=q[i].D;q[i].k=-q[i].D;
}
t[++n]=++D;q[n]=(data){D,0,0,0,-D,n};
sort(t+1,t+1+n);m=unique(t+1,t+1+n)-t-1;
for (int i=1;i<=n;i++) q[i].id=lower_bound(t+1,t+1+m,q[i].D)-t;
for (int i=1;i<=n;i++) w[q[i].id]++;
for (int i=1;i<=n;i++) w[i]+=w[i-1];
for (int i=1;i<=n;i++) q[i].id=w[q[i].id]--;
for (int i=1;i<=n;i++) w[i]=0;
sort(q+1,q+1+n,cmp);
solve(1,n);
printf("Case %d: %lld\n",++T,f[n]);
memset(f,0,sizeof(f));
}
return 0;
}

【hdu3842】 Machine Works的更多相关文章

  1. 【Poj1325】Machine Schedule机器调度

    目录 List Description Input Output Sample Input Sample Output HINT Solution Code Position: http://poj. ...

  2. 【UVA1194】Machine Schedule

    题目大意:给定 N 个任务和两台机器,每个任务可以在任意一台机器上执行,每台机器有 N 个启动状态,不同任务需要机器在不同的状态下执行,求执行所有任务需要多少个不同的状态. 题解:由于一个任务一定要被 ...

  3. 【332】Machine Learning

    Reference: 决策树方法-对买电脑进行分类预测 Reference: 最邻近规则分类(K-Nearest Neighbor)KNN算法应用 Reference: python 内建函数 str ...

  4. 【hdu4045】Machine scheduling(dp+第二类斯特林数)

    传送门 题意: 从\(n\)个人中选\(r\)个出来,但每两个人的标号不能少于\(k\). 再将\(r\)个人分为不超过\(m\)个集合. 问有多少种方案. 思路: 直接\(dp\)预处理出从\(n\ ...

  5. 机器学习(Machine Learning)&深度学习(Deep Learning)资料【转】

    转自:机器学习(Machine Learning)&深度学习(Deep Learning)资料 <Brief History of Machine Learning> 介绍:这是一 ...

  6. 【机器学习实战】Machine Learning in Action 代码 视频 项目案例

    MachineLearning 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远 Machine Learning in Action (机器学习实战) | ApacheCN(apa ...

  7. 【UML】-NO.43.EBook.5.UML.1.003-【UML 大战需求分析】- 状态机图(State Machine Diagram)

    1.0.0 Summary Tittle:[UML]-NO.43.EBook.1.UML.1.003-[UML 大战需求分析]- 状态机图(State Machine Diagram) Style:D ...

  8. 【翻译】What is State Machine Diagram(什么是状态机图)?

    [翻译]What is State Machine Diagram(什么是状态机图)? 写在前面 在上一篇学习类图的时候将这个网站上的类图的一篇文章翻译了出来,感觉受益良多,今天来学习UML状态机图, ...

  9. 【原】Coursera—Andrew Ng机器学习—Week 6 习题—Advice for applying machine learning

    [1] 诊断的作用 [2]过拟合 [3] [4] 高偏差bias,欠拟合underfitting 高方差variance,过拟合overfitting [5]参数λ Answer:  λ太大,则参数都 ...

随机推荐

  1. 微服务 Rpc和Rest协议

    原文:https://blog.csdn.net/king866/article/details/54174665 接口调用通常包含两个部分,序列化和通信协议.常见的序列化协议包括json.xml.h ...

  2. 20155209林虹宇 Exp7 网络欺诈防范

    Exp7 网络欺诈防范 简单应用SET工具建立冒名网站 kali要作为web服务器让靶机访问冒名网站,所以要使用阿帕奇web服务器软件. 要阿帕奇使用80端口.进入配置文件/etc/apache2/p ...

  3. 20155330 《网络攻防》 Exp3 免杀原理与实践

    20155330 <网络攻防> Exp3 免杀原理与实践 基础问题回答 杀软是如何检测出恶意代码的? 基于特征码.先对流行代码特征的提取,然后进行程序的比对,如果也检测到相应的特征码的程序 ...

  4. JavaEE笔记(十四)

    #SSH配置文件整合笔记实例 spring-BaseBean.xml <?xml version="1.0" encoding="UTF-8"?> ...

  5. 矩阵乘法&&矩阵快速幂&&最基本的矩阵模型——斐波那契数列

    矩阵,一个神奇又令人崩溃的东西,常常用来优化序列递推 在百度百科中,矩阵的定义: 在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合 ,最早来自于方程组的系数及常数所构成的方阵.这一 ...

  6. LoRa---她的简介和她的专业术语

    LoRa是LPWAN(低功耗广域网)通信技术的一种,其作用距离超过 15 公里,连接节点可达 100 万个.低功耗与长距离极限的组合可将最大数据速率提升至每秒 50千比特(Kbps). LoRa 是  ...

  7. openssh7.9 升级笔记

    由于全网安全检查需要,要对项目中1280台Linux系统升级SSH及openssl,其中: OPENSSH 升级为 openssh 7.9p 下载地址:  openssl 升级为 1.0.2o 下载地 ...

  8. HTML表单与输入实例

    解释HTML 表单用于搜集不同类型的用户输入.HTML 表单包含表单元素.表单元素指的是不同类型的 input 元素.复选框.单选按钮.提交按钮等等.<input> 元素<input ...

  9. cocos2dx内存优化

    纹理消耗了大量内存 在大部分情况下,是纹理(textures)消耗了游戏程序大量的内存.因此,纹理是我们首要考虑优化的对象 纹理加载 cocos2d里面纹理加载分为两个阶段:从图片文件中创建一个Ima ...

  10. 1065 A+B and C

    同样是一题会产生溢出的题,不同的是这个用大数类很麻烦,因为有负数的可能性 不妨利用溢出的特性来解题:两个整数和为负数 或者 两个负数和为正数,那么就溢出了. #include<bits/stdc ...