产品排序 product
【问题描述】
你是一个公司的员工,你会按时间顺序受到一些产品的订单,你需要用一个栈来改变这些订单的顺序(每个产品都必须入栈和出栈一次)。
按初始顺序,每次可以将一个产品入栈,或将栈顶产品弹至现在的序列末尾。每个产品有一个制作时间t i 和单位时间惩罚值d i 。
总的惩罚值为∑ ni=1 (s i × d i ),其中s i 为第i个产品的完成时间,你需要最小化总的惩罚值。
【输入】
输入文件 product.in。
第一行一个数n,表示产品个数。
接下来n行,每行两个数表示t i , d i 。
【输出】
输出文件 product.out。
一行一个数表示最小的总惩罚值。【样例输入】
4
1 4
3 2
5 2
2 1
【样例输出】
40
【数据范围】
30%: n ≤ 15
50%: n ≤ 100
100%: n ≤ 200, t i , d i ≤ 1000
正解:
f[l][r] : 标号 l~r 的最小惩罚值 (时间上以开始生产[ l , r ]的产品为起始)
< st[ ] 为时间前缀和 sd[ ] 为单位时间惩罚值前缀和>
在[l,r] 中枚举 i , i 为 [l,r]中最后一个出栈的元素 即栈中最后一个元素
f[l][r]=min(f[l][r],f[l][i-1]+f[i+1][r]+(st[i-1]-st[l-1])*(sd[r]-sd[i])+(st[r]-st[l-1])*d[i]);
这个转移方程式我真的想了差不多十分钟才看懂
如下:(一定要仔细,耐心理解 qwq)
i 为最后一个出栈的元素 所以 l ~ i-1 一定在 i 进栈前就出栈了(否则它们现在就还在栈中)
f[l][i-1] 和 f[i+1][r] 都只与它们内部的顺序以及 [ l , i ]的总时间有关
是两个互不相关的子问题
(st[r]-st[l-1])*d[i]) 是 i 的惩罚值 很好理解
(st[i-1]-st[l-1])*(sd[r]-sd[i]) 我觉得是一个很巧妙的地方啊
我觉得我现在说不清楚 要自己领会一下qwq
但是我还是要大概说一下<这里用记忆化搜索实现的>
是加法结合律的逆向运用
然后保证了计算f[i+1][r]的时间是包括[l,r]中比它们先出去的产品的完成时间的
至于内部的顺序问题 又到下一层函数解决了
层层递归
CODE
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; #define LY(p) freopen (p".in", "r", stdin); freopen (p".out", "w", stdout)
#define LL long long
#define dbl double
#define lf long double
#ifdef WIN32
#define L_L "%I64d"
#else
#define L_L "%lld"
#endif
#define N 210
int n, t[N], d[N], st[N], sd[N];
LL f[N][N]; int main()
{
scanf ("%d", &n);
for (int i = ; i <= n; i++) {
scanf ("%d %d", &t[i], &d[i]);
st[i] = st[i - ] + t[i];
sd[i] = sd[i - ] + d[i];
} memset (f, 0x3f, sizeof (f));
for (int i = ; i <= n; i++)
f[i][i] = d[i] * t[i], f[i][i - ] = ;
f[n + ][n] = ; for (int l = ; l < n; l++)
for (int i = ; i + l <= n; i++)
{
int j = i + l;
for (int k = i; k <= j; k++)
f[i][j] = min
(f[i][k - ] + f[k + ][j] + 1LL * (st[k - ] - st[i - ]) * (sd[j] - sd[k]) + 1LL * (st[j] - st[i - ]) * d[k], f[i][j]);
} printf (L_L, f[][n]);
return ;
}std 非记搜
#include<iostream>
#include<cstdio>
#define go(i,a,b) for(register int i=a;i<=b;i++)
#define ll long long
#define M 201
#define inf 21000000000000
using namespace std;
ll read()
{
int x=,y=;char c=getchar();
while(c<''||c>'') {if(c=='-') y=-;c=getchar();}
while(c>=''&&c<='') {x=(x<<)+(x<<)+c-'';c=getchar();}
return x*y;
}
ll n,t[M],d[M],st[M],sd[M],f[M][M];
ll dfs(int l,int r)
{
if(l>r) return ;
if(l==r) return t[l]*d[l];
if(f[l][r]) return f[l][r];
f[l][r]=inf;
go(i,l,r)
f[l][r]=min(f[l][r],dfs(l,i-)+dfs(i+,r)+(st[r]-st[l-])*d[i]+(st[i-]-st[l-])*(sd[r]-sd[i]));
return f[l][r];
}
int main()
{
n=read();
go(i,,n)
{
t[i]=read();st[i]=st[i-]+t[i];
d[i]=read();sd[i]=sd[i-]+d[i];
}
printf("%lld",dfs(,n));
return ;
}dtt 记搜
产品排序 product的更多相关文章
- 洛谷P1654 产品排序(sort)
P1654 产品排序(sort) 题目描述 有一系列产品,给定每个产品的加工时间和冷却成型时间(冷却过程产品之间没有关系,是单独冷却的).现在你手上有两台机器可以用来加工,你需要安排产品加工的顺序以及 ...
- 结构性产品 Structured Product
定义 结构性产品是固定收益产品(Fixed Income Instruments)的一个特殊种类.它将固定收益产品(通常是定息债券)与金融衍生交易(如远期.期权.掉期等)合二为一,增强产品收益或将投资 ...
- 产品排序(2015 年北大自招夏令营) (与栈相关的区间DP)
题面: \(solution:\) 又是一道\(DP\)的好题啊!状态并不明显,需要仔细分析,而且还结合了栈的特性! 做这一类题,只要出题人有点理想,一定会在栈的性质上做点文章,所以我们尽量围绕栈的性 ...
- magento 产品列表排序、分页功能
我们以 catalog_category_layered 控制器为例说明 在catalog.xml 找到catalog_category_layered配置段 <catalog_category ...
- Woocommerce 分类下的产品如何使用ID号来作为默认排序字段
在给一个客户开发网店系统时使用了WordPress系统的Woocommerce插件 WordPress版本:3.8 Woocommerce版本:2.0.20 如果没有指定排序规则(指定的字段),则Wo ...
- 实战_3:新建产品配置(product)并导出项目
产品配置Product 产品配置用于定义和管理RCP应用的多个方面特征.并支持将RCP项目导出为部署包(类似eclipse压缩包),可以直接部署到其他环境上使用. 产品配置必须新建一个 扩展名为 .p ...
- 什么是产品待办列表?(What is Product Backlog)
正如scrum指南中所描述的,产品待办事项列表是一个紧急而有序的列表,其中列出了改进产品所需的内容.它是scrum团队承担的工作的唯一来源. 在sprint计划 (Sprint Planning)活动 ...
- Magento创建configurable产品的要点
接着上一篇用API创建可配置的产品Configurable Product说事.Magento的产品类型可分为Simple Product.Group Product.Configurable Pro ...
- 【iOS开发必收藏】详解iOS应用程序内使用IAP/StoreKit付费、沙盒(SandBox)测试、创建测试账号流程!【2012-12-11日更新获取”产品付费数量等于0的问题”】
转的别人的 看到很多童鞋问到,为什么每次都返回数量等于0?? 其实有童鞋已经找到原因了,原因是你在 ItunesConnect 里的 “Contracts, Tax, and Banking”没有完成 ...
随机推荐
- 时空KSOA之CS表单工具说明
CS表单工具说明 1.调用: 1.1.单据事件调用 runbill_表单sn 调用无窗口表单 loadbill_表单sn 调用窗口表单 1.2.功能调用 功能号:LOADCSBILL 参数表单名称 1 ...
- Nginx - request_time和upstream_response_time的区别
request_time 官网描述:request processing time in seconds with a milliseconds resolution; time elapsed be ...
- P3223 [HNOI2012]排队
题目描述 某中学有 n 名男同学,m 名女同学和两名老师要排队参加体检.他们排成一条直线,并且任意两名女同学不能相邻,两名老师也不能相邻,那么一共有多少种排法呢?(注意:任意两个人都是不同的) 输入输 ...
- C++ STL 常用查找算法
C++ STL 常用查找算法 adjacent_find() 在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器.否则返回past-the-end. ...
- 【刷题】BZOJ 3669 [Noi2014]魔法森林
Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同学在号节 ...
- BZOJ 1898: [Zjoi2005]Swamp 沼泽鳄鱼
1898: [Zjoi2005]Swamp 沼泽鳄鱼 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1085 Solved: 604[Submit][S ...
- Alpha 冲刺 —— 十分之十
队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭鸭鸭鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 测试整体软件 展示GitHub当 ...
- HDU 5306 线段树
吉司机课件题. 区间min,区间最值,区间和. 如果用最大值和次大值能更新区间和那就更新打标记,否则暴力dfs. #include<iostream> #include<cstdio ...
- NOIWC2017&&THUWC2017 滚粗记
因为NOI WC的时候一直在生病,浑浑噩噩就过去了7天,基本没什么记忆了,所以就压到一篇里好了. day -1 第一次发现高铁的椅子原来还可以转过来,于是我们四个小伙伴面对面愉快的打了一路宣红A. 在 ...
- shell 变量匹配
${var%pattern} ${var%%pattern} ${var#pattern} ${var##pattern} ${var%pattern},${var%%pattern} 从右边开始匹配 ...