2018.07.08 NOIP模拟 ABCD(背包)
ABCD
题目背景
SOURCE:NOIP2016-AHSDFZ T2
题目描述
有 4 个长度为 N 的数组 a,b,c,d 。现在需要你选择 N 个数构成数组e ,数组e 满足 a[i]≤e[i]≤b[i] 以及
并且使得
最大。
输入格式
输入文件共 N+1 行。
第 1 行包含 1 个正整数 N 。
第 i+1 行包含 4 个整数 a[i],b[i],c[i],d[i] 。
输出格式
输出共 1 行,包含 1 个整数,表示所给出公式的最大值。输入数据保证一定有解。
样例数据 1
输入
5
-1 1 2 5
-2 2 1 2
0 1 1 3
-2 -1 3 10
-2 2 3 9
输出
2
样例数据 2
输入
10
1 10 1 7
-10 10 2 0
-10 10 2 2
-10 10 2 0
1 10 1 0
-10 10 2 0
10 10 2 0
1 10 1 0
-10 10 2 0
1 10 1 0
输出
90
样例数据 3
输入
10
1 10 1 0
-10 10 2 2
-10 10 2 2
-10 10 2 2
1 10 1 0
-10 10 2 2
-10 10 2 2
1 10 1 0
-10 10 2 2
1 10 1 0
输出
-4
备注
【数据规模与约定】
对于 20% 的数据,N≤10;-2≤a[i]< b[i]≤2;
对于 60% 的数据,N≤50;-20≤a[i]< b[i]≤20;
对于 100% 的数据,N≤200;-25≤a[i]< b[i]≤25;1≤c[i]≤20;0≤d[i] ≤100000。
好吧我承认这道题我又zz" role="presentation" style="position: relative;">zzzz了,考试时竟然爆0" role="presentation" style="position: relative;">00,唉下来之后发现就是个简单dp" role="presentation" style="position: relative;">dpdp。
我们对原来的限制条件变形,让0≤num[i]≤a[i]−b[i]" role="presentation" style="position: relative;">0≤num[i]≤a[i]−b[i]0≤num[i]≤a[i]−b[i],然后令num[i]=e[i]−a[i]" role="presentation" style="position: relative;">num[i]=e[i]−a[i]num[i]=e[i]−a[i],代入原来的式子运算,会发现这是一道背包。b[i]−a[i]" role="presentation" style="position: relative;">b[i]−a[i]b[i]−a[i]是物品的数量限制,num[i]" role="presentation" style="position: relative;">num[i]num[i]是物品i" role="presentation" style="position: relative;">ii的选取数量限制,c[i]" role="presentation" style="position: relative;">c[i]c[i]则是物品的大小,然后就是背包了。
然而我们发现,这样子只有60" role="presentation" style="position: relative;">6060分。因此需要用一个叫做单调队列的东西进行优化。代码如下:
#include<bits/stdc++.h>
#define N 210
#define M 100010
using namespace std;
int n,m,a[N],b[N],c[N],d[N],dp[M],ans,q[M],f[M],head,tail;
int main(){
scanf("%d",&n),ans=m=0;
for(int i=1;i<=n;++i){
scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);
b[i]-=a[i];
m-=a[i]*c[i];
ans+=a[i]*d[i];
}
memset(dp,128,sizeof(dp));
dp[0]=0;
for(int i=1;i<=n;++i)
for(int j=0;j<c[i];++j){
head=1,tail=0;
for(int k=j;k<=m;k+=c[i]){
if(head<=tail&&k-q[head]==(b[i]+1)*c[i])++head;
while(head<=tail&&f[tail]+(k-q[tail])/c[i]*d[i]<=dp[k])--tail;
q[++tail]=k,f[tail]=dp[k];
dp[k]=f[head]+(k-q[head])/c[i]*d[i];
}
}
printf("%d",ans+dp[m]);
return 0;
}
2018.07.08 NOIP模拟 ABCD(背包)的更多相关文章
- 2018.07.08 NOIP模拟 好数(线段树)
好数 题目背景 SOURCE:NOIP2016-AHSDFZ T3 题目描述 我们定义一个非负整数是"好数",当且仅当它符合以下条件之一: 1. 这个数是 0 或 1 . 2. 所 ...
- 2018.07.08 NOIP模拟 第K小数(二分)
第K小数 题目背景 SOURCE:NOIP2016-AHSDFZ T1 题目描述 有两个正整数数列,元素个数分别为 N 和 M .从两个数列中分别任取一个数相乘,这样一共可以得到 N*M 个数,询问这 ...
- EZ 2018 07 06 NOIP模拟赛
又是慈溪那边给的题目,这次终于没有像上次那样尴尬了, T1拿到了较高的暴力分,T2没写炸,然后T3写了一个优雅的暴力就203pts,Rank3了. 听说其它学校的分数普遍100+,那我们学校还不是强到 ...
- 2018.11.08 NOIP模拟 班车(倍增+dfs+bit)
传送门 对于每个点离线处理出向上走2i2^i2i班车到的最上面的点. 然后每个询问(u,v)(u,v)(u,v)先把(u,v)(u,v)(u,v)倍增到刚好走不到lcalcalca的情况(有一个点如果 ...
- 2018.11.08 NOIP模拟 水管(简单构造)
传送门 仔细读题会发现只要所有点点权之和等于0一定有解. 如何构造? 直接当做树来构造就行了,非树边都赋值成0就行. 代码
- 2018.11.08 NOIP模拟 景点(倍增+矩阵快速幂优化dp)
传送门 首先按照题意构造出转移矩阵. 然后可以矩阵快速幂求出答案. 但是直接做是O(n3qlogm)O(n^3qlogm)O(n3qlogm)的会TTT掉. 观察要求的东西发现我们只关系一行的答案. ...
- 2018.10.08 NOIP模拟 栅栏(树状数组+rand)
传送门 今天的送分题. 首先考虑每次给要围上栅栏的矩阵里的整体加上1,如果栅栏被撤销就整体减1,最后比较两个点的值是否相同来进行判断. 然而这样的效果并不理想,很容易卡掉. 进一步思考,我们第iii次 ...
- 2018.10.08 NOIP模拟 序列(主席树)
传送门 T2防ak题? 其实也不是很难(考试时sb了). 直接变形一下求出区间长度在[l2,r2][l2,r2][l2,r2]之间,中位数≤l1−1\le l1-1≤l1−1的区间数,和区间长度在[l ...
- 2018.10.08 NOIP模拟 斐波那契(贪心+hash/map)
传送门 签到题. 显然是可以贪心分组的,也就是尽量跟当前的分成一组. 这时我们需要判断a[l]+a[r],a[l+1]+a[r]...a[r−1]+a[r]a[l]+a[r],a[l+1]+a[r]. ...
随机推荐
- JS实现让滚轮控制网页头部显示与隐藏
在很多网站中都有鼠标网上滚动头部就会滑出,继续往下滚动就会隐藏,下面看看实现方法 scroll(); function scroll(){// 入口方法 这个方法是获取事件的兼容,获取delta -- ...
- WDA-参考路径
1. SAP Netweave安装 https://wenku.baidu.com/view/b3ac371a227916888486d77c.html?sxts=1545717961793 2. ...
- 面向对象三大特性一一继承(inheritance)和组合(Composition)
记住2句话(常识),像个正常人思考! 1.“ is-a ”关系 用 继承! 学生是人,学生继承人这个类, 2. “has-a ”关系 用 组合!电脑有显卡,那么我们就在计算机类中增加显卡属性来复用显 ...
- whlie and for
public class TestWhileAndFor { /**测试 while和for循环练习 * 100 以内的奇数和偶数的和 * @author Administrator * */ pub ...
- mark_2017_2_27
工作总结web_acl 535 git clone “ssh://git@outergit.yonyou.com:49622/esn_web/web_acl.git" 600 git bra ...
- Fb,tw等emoji相关
最近处理fb emoji,查了下相关的资料.记录于此 twitter blog 关于:https://blog.twitter.com/developer/en_us/a/2014/open-sou ...
- Java对称与非对称加密解密,AES与RSA
加密技术可以分为对称与非对称两种. 对称加密,解密,即加密与解密用的是同一把秘钥,常用的对称加密技术有DES,AES等 而非对称技术,加密与解密用的是不同的秘钥,常用的非对称加密技术有RSA等 为什么 ...
- Python issubclass() 函数
Python issubclass() 函数 Python 内置函数 描述 issubclass() 方法用于判断参数 class 是否是类型参数 classinfo 的子类. 语法 以下是 iss ...
- Birthday(费用流)
Birthday https://www.nowcoder.com/acm/contest/206/A 题目描述 恬恬的生日临近了.宇扬给她准备了一个蛋糕. 正如往常一样,宇扬在蛋糕上插了n支蜡烛,并 ...
- 蚁群算法(Java)tsp问题
1.理论概述 1.1.TSP问题 旅行商问题,即TSP问题(旅行推销员问题.货郎担问题),是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只 ...