产品排序 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

 1 #include <cmath>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <iostream>
 5 #include <algorithm>
 6 using namespace std;
 7
 8 #define LY(p) freopen (p".in", "r", stdin); freopen (p".out", "w", stdout)
 9 #define LL long long
10 #define dbl double
11 #define lf long double
12 #ifdef WIN32
13 #define L_L "%I64d"
14 #else
15 #define L_L "%lld"
16 #endif
17 #define N 210
18 int n, t[N], d[N], st[N], sd[N];
19 LL f[N][N];
20
21 int main()
22 {
23     scanf ("%d", &n);
24     for (int i = 1; i <= n; i++) {
25         scanf ("%d %d", &t[i], &d[i]);
26         st[i] = st[i - 1] + t[i];
27         sd[i] = sd[i - 1] + d[i];
28     }
29
30     memset (f, 0x3f, sizeof (f));
31     for (int i = 1; i <= n; i++)
32         f[i][i] = d[i] * t[i], f[i][i - 1] = 0;
33     f[n + 1][n] = 0;
34
35     for (int l = 1; l < n; l++)
36         for (int i = 1; i + l <= n; i++)
37         {
38             int j = i + l;
39             for (int k = i; k <= j; k++)
40                 f[i][j] = min
41                     (f[i][k - 1] + f[k + 1][j] + 1LL * (st[k - 1] - st[i - 1]) * (sd[j] - sd[k]) + 1LL * (st[j] - st[i - 1]) * d[k], f[i][j]);
42         }
43
44     printf (L_L, f[1][n]);
45     return 0;
46 }

std 非记搜

 1 #include<iostream>
 2 #include<cstdio>
 3 #define go(i,a,b) for(register int i=a;i<=b;i++)
 4 #define ll long long
 5 #define M 201
 6 #define inf 21000000000000
 7 using namespace std;
 8 ll read()
 9 {
10     int x=0,y=1;char c=getchar();
11     while(c<‘0‘||c>‘9‘) {if(c==‘-‘) y=-1;c=getchar();}
12     while(c>=‘0‘&&c<=‘9‘) {x=(x<<1)+(x<<3)+c-‘0‘;c=getchar();}
13     return x*y;
14 }
15 ll n,t[M],d[M],st[M],sd[M],f[M][M];
16 ll dfs(int l,int r)
17 {
18     if(l>r) return 0;
19     if(l==r) return t[l]*d[l];
20     if(f[l][r]) return f[l][r];
21     f[l][r]=inf;
22     go(i,l,r)
23         f[l][r]=min(f[l][r],dfs(l,i-1)+dfs(i+1,r)+(st[r]-st[l-1])*d[i]+(st[i-1]-st[l-1])*(sd[r]-sd[i]));
24     return f[l][r];
25 }
26 int main()
27 {
28     n=read();
29     go(i,1,n)
30     {
31         t[i]=read();st[i]=st[i-1]+t[i];
32         d[i]=read();sd[i]=sd[i-1]+d[i];
33     }
34     printf("%lld",dfs(1,n));
35     return 0;
36 }

dtt 记搜

原文地址:https://www.cnblogs.com/forward777/p/10327827.html

时间: 2024-10-25 00:18:18

产品排序 product的相关文章

洛谷P1654 产品排序(sort)

P1654 产品排序(sort) 题目描述 有一系列产品,给定每个产品的加工时间和冷却成型时间(冷却过程产品之间没有关系,是单独冷却的).现在你手上有两台机器可以用来加工,你需要安排产品加工的顺序以及去哪台机器加工,使得所有产品都成型的时间最早.机器之间互不相关,可以同时进行工作,一个机器一个时刻只能加工一个产品. 输入输出格式 输入格式: 第一行一个数n,表示产品个数,以下n行,每行两个数分别表示产品加工的时间A[i]和冷却时间B[i]. [数据规模] 对于20%的数据,满足n≤6: 对于10

结构性产品 Structured Product

定义 结构性产品是固定收益产品(Fixed Income Instruments)的一个特殊种类.它将固定收益产品(通常是定息债券)与金融衍生交易(如远期.期权.掉期等)合二为一,增强产品收益或将投资者对未来市场走势的预期产品化.简而言之,结构化产品是以金融工程学知识为基础,利用基础金融工具和金融衍生工具进行不同的组合得到的一类金融创新产品. 结构性产品(structured product),又称结构性票据(structured notes).联动债券.合成债券等,Das(2001)把此产品定

产品经理(Product Manager)对技术应有怎样的了解

1.技术架构/实现方式 比如设计一个网站类的产品是使用什么编程语言开发的php,jsp或者Python.确定了编程语言以后你要知道整个产品项目中使用了什么开发框架,是团队自己研发的框架,还是使用市面上比较流行的框架.其次是数据库的选择,根据你们的业务需求是使用mysql这种关系型数据库还是mongodb这类非关系型数据库,最后就是服务器,服务器一般关心的问题就是稳定性,安全性,还有负载了. 根据不同需求选择服务器, 使用什么样的服务器?自己管理的,还是云.如果是云的话还要了解一些云服务和产品的内

[2015北大自招夏令营]产品排序

题意: 现有n个产品,按初始顺序,每次可以将一个产品入栈,或将栈顶产品弹至现在的序列末尾.每个产品有一个制作时间\(t_i\)和单位时间惩罚值\(d_i\),总的惩罚值为\(\sum_{i=1}^{n}\)(\(s_i×d_i\)),其中\(s_i\)为第i个产品的完成时间,你需要最小化总的惩罚值. 分析: 考虑最后出栈的是 i,则 1 至 i-1 在 i 入栈前就已经弹出,与 i+1 至 n 的顺序没有关系,并且 i+1 至 n 的惩罚值只跟他们的顺序与\(\sum{t_j}\) \((1<=

magento 产品列表排序、分页功能

我们以 catalog_category_layered 控制器为例说明 在catalog.xml 找到catalog_category_layered配置段 <catalog_category_layered translate="label"> <label>Catalog Category (Anchor)</label> <reference name="left"> <block type="

Woocommerce 分类下的产品如何使用ID号来作为默认排序字段

在给一个客户开发网店系统时使用了WordPress系统的Woocommerce插件 WordPress版本:3.8 Woocommerce版本:2.0.20 如果没有指定排序规则(指定的字段),则Woocommerce默认使用的是"post_title"来排序的,但我在调用分类下的产品时使用"ID"字段来自定义排序规则,但实际上却并未按照自定义的规则来排序,而是使用”ORDER BY menu_order,post_title ASC“来排序(在product_ca

新建产品配置(product)并导出项目

产品配置Product 产品配置用于定义和管理RCP应用的多个方面特征.并支持将RCP项目导出为部署包(类似eclipse压缩包),可以直接部署到其他环境上使用. 产品配置必须新建一个 扩展名为 .product的配置文件,一般在根目录下创建. 如果产品配置存在问题,导致项目不能正常导出的话,就很痛苦了.所以这一步相当重要,另外一些版本的eclipse使用product配置导出项目时存在问题. 网上也有资料介绍使用Tycho管理和打包项目的. 新建产品配置: 右键项目 ->  New -> P

【j2ee spring】41、巴巴运动网的产品查询

巴巴运动网的产品查询 1.项目图解 2.我们开始做我们的相应的功能模块 页面的素材我会上传的,链接是:http://download.csdn.net/detail/cutter_point/8803985 产品的查询界面query_product.jsp <%@ page isELIgnored="false" contentType="text/html;charset=UTF-8" %> <%@ taglib uri="/strut

【转】如何设计动态(不定)字段的产品数据库表?

因为最近要用到设计动态量表的功能,找了一篇技术上实现动态设计表字段的文章,借来用用. 原文地址:http://blog.sina.com.cn/s/blog_85295a390101dou0.html 项目组会议上讨论的关于不定字段数目的数据库表问题并没有结果,今天继续分析之后发现问题可能还更大.当时讨论的结果是可能采用四种技术: 动态增加数据库表字段 预留足够的空白字段,运行时作动态影射 用xml格式保存在单字段里 改列为行,用另外一个表存放定制字段 [一] 现在我们来分析一下四种技术的优劣,