pq

题目描述

小q 的女朋友送给小q nn个整数。但是这些数太大了,小q 的女朋友拿不动,于是拜托小q把这些数减少一些。

小q 每次可以选择其中的两个x,yx,y (不能同时选择同一个数) 变成x−P,y−Qx−P,y−Q,现在他希望能知道最多能帮女朋友减掉多少P,QP,Q。

输入

第一行一个数表示nn。

第二行由空格隔开的nn个数。

第三行两个数,表示p,qp,q。

输出

一行一个数,表示能减掉的PP和QQ的总和。

样例输入

<span style="color:#333333"><span style="color:#333333">输入样例1
2
100 100
50 50
输入样例2
3
50 250 50
50 100
输入样例3
4
123 456 789 555
58 158</span></span>

样例输出

<span style="color:#333333"><span style="color:#333333">输出样例1
200
输出样例2
300
输出样例3
1728</span></span>

提示

对于前20%的数据,n≤5;

对于100%100%的数据,1≤n≤50,ci≤2000,50≤P,Q≤2000。

来源

2018年10月hnsdfz集训


solution

令状态f[i][x][y] 表示前i个数,p有x个没有匹配,q有y个没有匹配

我们枚举i被分成了几个p和几个q

设分了nx个p ny个q,

然后分类讨论

1 

 if(nx<=y&&ny<=x)
f[x-ny][y-nx]=max(f[x-ny][y-nx],g[x][y]+nx+ny);

意思是nx ny全部用于匹配原来未匹配的x,y

2

if(nx<=y&&ny>x)
f[0][y+ny-x-nx]=max(f[0][y+ny-x-nx],g[x][y]+nx+x);

意思是多出的x都被匹配完了 ny剩的加到多出的y上

3

if(nx>y&&ny<=x)
f[nx+x-y-ny][0]=max(f[nx+x-y-ny][0],g[x][y]+ny+y);

同2

4

if(nx>y&&ny>x)
f[nx-y][ny-x]=max(f[nx-y][ny-x],g[x][y]+x+y);

意思是ny nx都有剩 (恰好交换了)

还有几个问题

1. 50*2000*2000 MLE

滚动数组

2.TLE

(1) 不需要枚举p和q,只要枚举p,贪心取q(一定最优)

(2)真正有用的的dp范围只有[40][40]   [0][2000] [2000][0]

因为,加入一个数时

啊我忘了 (留坑待填)

orz神犇拒绝滚动怒卡空间

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
int n,pp,qq,s[55],f[2005][2005],flag[2005][2005];
int g[2004][2005];
struct node{
int id,x,y;
}t,ne;
queue<node>q;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)scanf("%d",&s[i]);
cin>>pp>>qq;
t.id=t.x=t.y=0;q.push(t);int nn=0;
while(!q.empty()){
node a=q.front();q.pop();
///cout<<a.id<<' '<<a.x<<' '<<a.y<<' '<<f[a.id][a.x][a.y]<<endl;
if(a.id==n)break;
if(a.id>nn){
for(int j=0;j<=2000;j++){
g[0][j]=f[0][j];g[j][0]=f[j][0];
f[0][j]=0;f[j][0]=0;
flag[0][j]=0;flag[j][0]=0;
}
for(int i=1;i<=40;i++)
for(int j=1;j<=40;j++){
g[i][j]=f[i][j];f[i][j]=0;flag[i][j]=0;
} nn=a.id;
}
int i=a.id,x=a.x,y=a.y; for(int nx=0;nx*pp<=s[i+1];nx++){
int la=s[i+1]-nx*pp;
int ny=la/qq;
if(nx<=y&&ny<=x)
{
f[x-ny][y-nx]=max(f[x-ny][y-nx],g[x][y]+nx+ny);
if(!flag[x-ny][y-nx]){
flag[x-ny][y-nx]=1;
ne.id=i+1;ne.x=x-ny;ne.y=y-nx;
q.push(ne);
}
}
if(nx<=y&&ny>x){
f[0][y+ny-x-nx]=max(f[0][y+ny-x-nx],g[x][y]+nx+x);
if(!flag[0][y+ny-x-nx]){
flag[0][y+ny-x-nx]=1;
ne.id=i+1;ne.x=0;ne.y=y+ny-x-nx;
q.push(ne);
}
}
if(nx>y&&ny<=x){
f[nx+x-y-ny][0]=max(f[nx+x-y-ny][0],g[x][y]+ny+y);
if(!flag[nx+x-y-ny][0]){
flag[nx+x-y-ny][0]=1;
ne.id=i+1;ne.x=nx+x-y-ny;ne.y=0;
q.push(ne);
}
}
if(nx>y&&ny>x){
f[nx-y][ny-x]=max(f[nx-y][ny-x],g[x][y]+x+y);
if(!flag[nx-y][ny-x]){
flag[nx-y][ny-x]=1;
ne.id=i+1;ne.x=nx-y;ne.y=ny-x;
q.push(ne);
}
}
}
}
int ans=0;
for(int i=0;i<=2000;i++)
for(int j=0;j<=2000;j++)ans=max(ans,f[i][j]*(pp+qq));
cout<<ans<<endl;
return 0;
}

pq的更多相关文章

  1. PQ格式化虚拟机硬盘如何生效

    用pq格式化虚拟机硬盘后,安装时,总是从dhcp的网卡启动,没有从硬盘启动 但是用ghost是可以拷贝镜像文件的 这就是说,硬盘有了,但是没有将硬盘"激活",没有将硬盘设为acti ...

  2. (转)PQ分区魔术师中文版分区教程

    PQ分区魔术师中文版分区的图解,图文并茂很多朋友提到硬盘分区,觉得不敢轻易去尝试,怕得不偿失,深度xp系统下载在此分享下pq分区的图解详见下图: 1)这是用的雨林木风系统的光盘,其他系统盘一样 2)首 ...

  3. 已知整数m,n,p,q适合(m-p)|(mn+pq)证明:(m-p)|(mq+np)(整除理论1.1.5)

    已知整数m,n,p,q适合(m-p)|(mn+pq)证明:(m-p)|(mq+np) 证明: 令(mn+pq)—(mq+np) =mn-np+pq-mq =n(m-p)+q(p-m) =(n-q)(m ...

  4. 谓词逻辑 p->q 的真假

    若p为假,则q可取真或假,p->q为永真 若p为真,q为假,则p->q为假 若p为真,q为真,则p->q为真 p q p->q 0 0 1 0 1 1 1 0 0 1 1 1 ...

  5. 为什么因式分解n=pq分别得到pq是求解密钥中d的关键

    从d的来源来说,它是这样来的: "找到一个数d,使得ed-1能够被z整除.即给定e,选择数d,使得ed被z除的余数为1",即  ed=1 (mod z) 上面这句话中,为了求d,我 ...

  6. IQ/OQ/DQ/PQ

    Installation Qualification (IQ) 安装验证,安装时在用户处进行.它提供文件证明用户安装环境所有的规格及参数完全符合制造商的描述和安全 要求. Operation Qual ...

  7. QOS-基本拥塞管理机制(PQ CQ WFQ RTPQ)

    QOS-基本拥塞管理机制(PQ CQ WFQ RTPQ) 2018年7月7日    20:29 拥塞:是指当前供给资源相对于正常转发处理需要资源的不足,从而导致服务质量下降的一种现象 拥塞管理概述: ...

  8. CFS/FQ/PQ调度与WRR负载均衡

    动机 五一临近,四月也接近尾声,五一节乃小长假的最后一天.今天是最后一天工作日,竟然感冒了,半夜里翻来覆去无法安睡,加上窗外大飞机屋里小飞机(也就是蚊子)的骚扰,实在是必须起来做点有意义的事了!    ...

  9. RDA PQ工具使用 (Adi Analysis)

    PQ工具“ColorAdjustTool.exe”,请注意芯片的选择: RDA512C选择533 RDA8501选择331 RDA8503选择131  工模菜单 COLOR LUT: R/G/B/Y/ ...

随机推荐

  1. Python F-string 更快的格式化

    Python的格式化有%s,format,F-string,下面是比较这三种格式化的速度比较 In [12]: a = 'hello' In [13]: b = 'world' In [14]: f' ...

  2. 5-15 笔记 jtopo使用

    Jtopo的核心对象有6个,分别是Stage(舞台对象),Scene(场景对象),Node(节点对象),Link(连线对象),Container(容器对象),Effect.Animate(动画效果) ...

  3. oo作业第四单元总结暨结课总结

    目录 一.第四单元作业架构设计 1.第一次UML作业架构设计 2.第二次UML作业架构设计 二.架构设计和OO方法理解演进 三.测试理解与实践的演进 四.课程收获总结 五.三个具体改进建议 一.第四单 ...

  4. 更改yum网易、阿里云的yum源

    更改yum源为网易的. 首先备份/etc/yum.repos.d/CentOS-Base.repomv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos ...

  5. POI Excel 插入新的行,下面的行动态移动

    在做Excel 模板时,会有遇到  模板行数不固定,如下图  需要在行次4下面再插入一行:注意:(插入的行如果是下面空白行,需要创建行) 解决方法是使用shifRows方法,第1个参数是指要开始插入的 ...

  6. 十六、MySQL LIKE 子句

    MySQL LIKE 子句 我们知道在 MySQL 中使用 SQL SELECT 命令来读取数据, 同时我们可以在 SELECT 语句中使用 WHERE 子句来获取指定的记录. WHERE 子句中可以 ...

  7. 六、MySQL 删除数据库

    MySQL 删除数据库 使用普通用户登陆 MySQL 服务器,你可能需要特定的权限来创建或者删除 MySQL 数据库,所以我们这边使用 root 用户登录,root 用户拥有最高权限. 在删除数据库过 ...

  8. composer 自动加载源码解析

    一直在用 composer,最近想看一下具体的原理是什么,就仔细阅读了一下源码,一下是个人理解.在看该文章前最好了解一下 PSR-4 自动加载规范 引入类自动加载文件 # 加载类自动加载文件 requ ...

  9. 麦子学院python开发全套完整无加密课程

    点击了解更多Python课程>>> 麦子学院python开发全套完整无加密课程 第一阶段:Python基础准备 1.Web前端开发之HTML+CSS基础入门 2.Javascript ...

  10. Assignment HDU - 2853(二分图匹配 KM 新边旧边)

    传送门: Assignment HDU - 2853 题意:题意直接那松神的题意了.给了你n个公司和m个任务,然后给你了每个公司处理每个任务的效率.然后他已经给你了每个公司的分配方案,让你求出最多能增 ...