2017.07.11【NOIP提高组】模拟赛B组
Summary
今天的比赛打得还不错,第一题被同桌灌输的贪心,纯模拟洗脑了,然后steal的看了一下,发现怎么也对不了,一直在检查。最后10分钟才找出反例,推出动态规划方程,没有想到怎么转移,比赛就结束了。第二题题意理解错误了,但是还是拿到了充满希望的10分,第三题看到题目就直接上了线段树,我想没几个人能像我一样5分钟想完并打完这道题了。贪心一定要看到反例,不能盲目去做,否则浪费了时间,更让心情愈来愈不甘。
Problem
T1 解题
题目大意
奶牛有P (P≤300) 道题目要做。他们的月薪是M (m≤1000) 元。
每做一道题需要两笔付款,第一笔A_i(1≤A_i≤M)元在做题的那一个月初支付,第二笔B_i元(1≤B_i≤M)在做完后的下一个月初支付,牛没有任何存款意识
题目必须按大概顺序解出。比如,题目3必须在解题目4之前或同一个月解出.
找出牛们做完所有题目并支付完所有款项的最短月数。
想法
刚开始比赛的是被被传销洗脑成贪心,结果一直在检查错误,殊不知,其实是动态规划,下面给一个贪心的反例
7 3
2 5
2 5
5 2
按照贪心,答案是6,其实最优应该是5
我们有两种DP的方法,一种是被姚大神称为垃圾的,另一种也是被他称为垃圾的
(1) 动态规划
我们设f[i,j]表示你解答前i个问题,最后一次连续解答了j个问题的最少月份数
状态转移方程:
1.在前i~j件事情付清尾款当月付j个项目的首款:d[i][j]=min(d[i-j][x]+1) 当sumb[j-1-x+1][j-1]+suma[j][i]≤pay}
2.在前i~j件事情付清尾款后的一个月付j个项目的首款:d[i][j]=min(d[i-j][x]+2) 当 sumb[j-1-x+1][j-1]≤pay && suma[j][i]≤pay
x表示上一个月同时付了x个problem的首款,suma,sumb分别是输入的前缀和
假设我们现在已经完成了i-j个problem的解答(上一个月同时付了x个problem的首款),现在要付连续j个problem的首款。在本月结束时,我们要保证前i个程序都已经在解答中(或者已经解出)且本月进行了j个解答,那么截止本月初付过前x个problem的尾款后,总共是完成了i-j个problem;本月要完成的问题的编号是从i-j+1一直到i,那么我们就可以推出,上一个月要完成的问题的编号为i-j-x+1到i-j。按照我们上面分析的,我们有两种选择:
1.同时付清上一组x个problem的尾款和这一组j个problem的首付;
2.在上一组x个problem的尾款付清后,进行j个problem的首付。
设suma[i][j]、sumb[i][j]分别为首付前缀和尾款前缀和,分别表示第i个问题至第j个问题的首付之和、第i个问题至第j个问题的尾款之和。
无论如何,都需要保证这个月的结余必须为正数、且下一个月将要付清的本月尾款必须也不能超过工薪(如果大于了工薪,那么本月或下一个月奶牛就破产了=_+)。
(2) 动态规划
我们设f[i,j]表示你在第i天,选了j个任务的最少欠费。枚举一个k,表示上个月选到最后的题目是多少
方程为f[k,i]:=min(sum_b[j+1,i])当sum_a[j+1,i]+f[k-1,j]≤m
sum_a[j,i]表示a[j]到a[i]的和,sum_b亦然
sum_a[j+1,i]+f[k-1,j]≤m其实就是如果上个月选的题目的首付,之前的欠费,是否会使奶牛破产
f[k,i]表示,当前的欠费,上一次选了多少题目的第二笔付款,欠费就是对应的sum_b
T2 JIH的玩偶(tree)
题目大意
这张网以玩具厂为总代理(根),构成一颗树。每个节点都代表一个客户,且每个节点都有重要度ai。JIH想将这些客户划成若干类别,当然同一类的客户重要度相差太大总是不妥。所以JIH决定先进行市场调研。JIH会选择两个客户X,从X向根走一共k个节点进行调查。调查的结果是这条路径上重要程度相差最大的两个客户的差值是多少。因为特殊需要,要求重要度大的客户必须在重要度小的客户后面(顺序为X到根,若序列为递减,则输出0,详情见样例)。
想法
树上倍增,第一次做
其实就是类似于树上求RMQ,跟RMQ思想差不多,维护类似的,设f/gmax/gmin/gans[i,k]表示从i到i的第2k个祖先中,对应的编号,最大值,最小值,最大值减最小值。
其实就是在是查询难一点而已
对于每个询问,先找到最大的k使得g[x,k]在终点或终点以下,
Ans=max(ans,gu[x,k],gb[x,k]-last);
last:=min(last,gs[x,k]);//最小值
x:=g[x,k];//当前点
如此递归求解,直到x为终点
画一下图就知道了,其实很简单的,不必多说
T3 进化序列(evolve)
题目大意
一个基因Ax 可以进化为序列中在它之后的基因Ay。这个进化的复杂度,等于Ax | Ax+1...| Ay的值,其中| 是二进制或运算。
Abathur 认为复杂度小于M 的进化的被认为是温和的。它希望计算出温和的进化的对数。
想法
维护一个最大的k,表示当前a[i~k]的数or起来是符合题目条件的,且保证k>i
其贡献值为k-i
因为or运算是不会变小的,所以k是线性的,关键是快速判断a[i~k]的数是否符合题目条件
可以用线段树,树状数组,RMQ
不会的可以去学。
2017.07.11【NOIP提高组】模拟赛B组的更多相关文章
- 2017.1.16【初中部 】普及组模拟赛C组总结
2017.1.16[初中部 ]普及组模拟赛C组 这次总结我赶时间,不写这么详细了. 话说这次比赛,我虽然翻了个大车,但一天之内AK,我感到很高兴 比赛 0+15+0+100=115 改题 AK 一.c ...
- 2018.12.30【NOIP提高组】模拟赛C组总结
2018.12.30[NOIP提高组]模拟赛C组总结 今天成功回归开始做比赛 感觉十分良(zhōng)好(chà). 统计数字(count.pas/c/cpp) 字符串的展开(expand.pas/c ...
- ZROI提高组模拟赛05总结
ZROI提高组模拟赛05总结 感觉是目前为止最简单的模拟赛了吧 但是依旧不尽人意... T1 有一半的人在30min前就A掉了 而我花了1h11min 就是一个简单的背包,我硬是转化了模型想了好久,生 ...
- NOIP2017提高组 模拟赛15(总结)
NOIP2017提高组 模拟赛15(总结) 第一题 讨厌整除的小明 [题目描述] 小明作为一个数学迷,总会出于数字的一些性质喜欢上某个数字,然而当他喜欢数字k的时候,却十分讨厌那些能够整除k而比k小的 ...
- NOIP2017提高组 模拟赛13(总结)
NOIP2017提高组 模拟赛13(总结) 第一题 函数 [题目描述] [输入格式] 三个整数. 1≤t<10^9+7,2≤l≤r≤5*10^6 [输出格式] 一个整数. [输出样例] 2 2 ...
- NOIP2017提高组模拟赛 10 (总结)
NOIP2017提高组模拟赛 10 (总结) 第一题 机密信息 FJ有个很奇怪的习惯,他把他所有的机密信息都存放在一个叫机密盘的磁盘分区里,然而这个机密盘中却没有一个文件,那他是怎么存放信息呢?聪明的 ...
- NOIP2017提高组模拟赛 8(总结)
NOIP2017提高组模拟赛 8(总结) 第一题 路径 在二维坐标平面里有N个整数点,Bessie要访问这N个点.刚开始Bessie在点(0,0)处. 每一步,Bessie可以走到上.下.左.右四个点 ...
- NOIP2017提高组模拟赛 9 (总结)
NOIP2017提高组模拟赛 9 (总结) 第一题 星星 天空中有N(1≤N≤400)颗星,每颗星有一个唯一的坐标(x,y),(1≤x,y ≤N).请计算可以覆盖至少K(1≤K≤N)颗星的矩形的最小面 ...
- NOIP2017提高组模拟赛 7(总结)
NOIP2017提高组模拟赛 7(总结) 第一题 斯诺克 考虑这样一个斯诺克球台,它只有四个袋口,分别在四个角上(如下图所示).我们把所有桌子边界上的整数点作为击球点(除了4个袋口),在每个击球点我们 ...
- NOIP2017提高组模拟赛5 (总结)
NOIP2017提高组模拟赛5 (总结) 第一题 最远 奶牛们想建立一个新的城市.它们想建立一条长度为N (1 <= N <= 1,000,000)的 主线大街,然后建立K条 (2 < ...
随机推荐
- [转] mongoose学习笔记(超详细)
名词解释 Schema: 一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力 Model: 由Schema编译而成的假想(fancy)构造器,具有抽象属性和行为.Model的每一个实例(ins ...
- C语言整理——文件系统和文件访问
标准C中规定了文件系统的访问和对文件本身的访问.不管是windows系统或者是泛unix系统,都实现了这些接口.在了解这些知识后,跨平台编程也将非常容易. 对文件系统的访问接口有: chdrive() ...
- day5.python列表练习题
写代码,有如下列表,按照要求实现每一个功能 li = [“alex”, “WuSir”, “ritian”, “barry”, “wenzhou”] 1.计算列表的长度并输出 print(len(li ...
- P1026 统计单词个数 区间dp
题目描述 给出一个长度不超过200200的由小写英文字母组成的字母串(约定;该字串以每行2020个字母的方式输入,且保证每行一定为2020个).要求将此字母串分成kk份(1<k \le 401& ...
- 记Ubuntu Mongodb 和 Mysql的安装与使用
安装mongodb 参考链接 https://www.cnblogs.com/shileima/p/7823434.html https://blog.csdn.net/xlengji/article ...
- Python json 读取 json 文件并转为 dict
Python json 读取 json 文件并转为 dict 在 D 盘 新建 test.json: { "test": "测试\n换行", "dic ...
- 爬虫2 urllib用法
from urllib import request,parse # 1. 解析数据 # 解析一条 # response = request.urlopen(url='http://httpbin.o ...
- mybatis sql注入
这是${}与#{}的区别,#{}采用了预编译,在SQL执行前,会先将上面的SQL发送给数据库进行编译:执行时,直接使用编译好的SQL,替换占位符“?”就可以了.因为SQL注入只能对编译过程起作用,所以 ...
- 离线下载安装 NLTK 的 nltk_data 模块
离线下载安装 NLTK 的 nltk_data 模块 转 https://blog.csdn.net/u010167269/article/details/63684137 在 Linux 上使用 N ...
- shell 自加
Linux Shell中写循环时,常常要用到变量的自增,现在总结一下整型变量自增的方法.我所知道的,bash中,目前有五种方法:1. i=`expr $i + 1`;2. let i+=1;3. (( ...