题意

一个人为了楼顶的金币要去跳楼,但是不能往更矮的楼上跳。

求在一个长为N的序列中总点权值和大于等于K的不下降序列数。

N<=40,K<=4e10

官方题解

折半搜索的经典例子!N在20范围内搜索能过,40范围内需要折半,由于只能向右跳,所以可以先离散化高度后将数据分为左右两部分,分别DFS出两边的合法状态(每个状态就是合法的大楼高度不下降子序列,其中包含两个属性(子序列中val价值总和,左半边是最后1个楼的高度h,而右半边是第一个楼的高度h)),然后再排序考虑合并。左半部按价值总和从大到小排序,右半部从小到大排序,统计右半部的各种高度前缀和。

双指针从左往右扫,统计合法的方案数。

方法二:只对右半部分按总金币从小到大排序,保持valL+valR≥K && hL≤hR,二分对右半部分查找并匹配左半部分。

本人题解

一看这个K,肯定要开long long ,由于N很小,空间不涉及金币数是绝对没问题的,用暴力搜索是O(2^N)必定会超时。

如果单单是求以 i 开头的金币最多的子序列,我们可以用DP求,如果单单是求以 i 开头的子序列数,我们也可以用DP求,但是题目把它们结合了,而且限制了金币数的下限,虽然我们可以预处理DP判断以 i 开1头的最多金币数是否达标……

没错,只要我们可以O(1)判断以 i 开头的最多金币数是否达标,就可以是很不错的剪枝。

此外,若 i 本身的金币数就达标了,那answer岂不是直接加上以 i 开头的子序列数?

这两个剪枝一加上,我们的搜索就能变快许多倍。而且都可以用DP预处理。

考虑时间复杂度,answer包含的情况我们肯定算过,而不在answer中的方案,我们肯定在序列中第一个无效点就return了,所以最坏情况是O(answer),可以过。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#define max(x,y) ((x) > (y) ? (x) : (y))
#define min(x,y) ((x) < (y) ? (x) : (y))
#define abs(x) ((x) < 0 ? -(x) : (x))
#define LL long long
#define lowbit(x) (-(x) & (x))
using namespace std;
LL read() {
LL f = 1,x = 0;char s = getchar();
while(s < '0' || s > '9') {if(s == '-') f = -1;s = getchar();}
while(s >= '0' && s <= '9') {x = x * 10 + s - '0';s = getchar();}
return x * f;
}
LL n,m,i,j,o,k,cnt;
LL h[45],g[45];
LL dp1[45],dp2[45];//最大金币数,子序列数
LL dfs(int x,LL mon) {
LL as = 0;
if(dp1[x] < mon) return 0;
if(g[x] >= mon) return dp2[x];
for(int i = x + 1;i <= n;i ++) {
if(h[i] >= h[x]) {
as += dfs(i,mon - g[x]);
}
}
return as;
}
int main() {
n = read();m = read();
for(int i = 1;i <= n;i ++) {
h[i] = read();
g[i] = read();
}
for(int i = n;i >= 0;i --) {//DP预处理
dp1[i] = g[i];
dp2[i] = 1;
for(int j = n;j > i;j --) {
if(h[j] >= h[i]) {
dp1[i] = max(dp1[i],dp1[j] + g[i]);
dp2[i] += dp2[j];
}
}
}
printf("%lld\n",dfs(0,m));
return 0;
}

San(COCI2017.2)题解的更多相关文章

  1. 网络流24(san)题题解汇总

    开坑(烂尾预定 1.餐巾计划问题 题解 2.最小路径覆盖问题 题解 3.试题库问题 题解 4.[CTSC1999]家园 题解 5.骑士共存问题 题解 6.最长不下降子序列问题 题解 7.深海机器人问题 ...

  2. Usmjeri(COCI2017.2)题解

    题意 给一棵N个节点的树,编号从1到N,再给定m对点(u,v),你要将树上的每条无向边变为有向边,使得给定的点对都满足u能到达v或v能到达u.问有多少种不同的方案,答案对(1e9+7)求余. 1 ≤ ...

  3. 题解 P4093 【[HEOI2016/TJOI2016]序列】

    这道题原来很水的? noteskey 一开始以为是顺序的 m 个修改,然后选出一段最长子序列使得每次修改后都满足不降 这 TM 根本不可做啊! 于是就去看题解了,然后看到转移要满足的条件的我发出了黑人 ...

  4. PTA|团体程序设计天梯赛-练习题目题解锦集(C/C++)(持续更新中……)

    PTA|团体程序设计天梯赛-练习题目题解锦集(持续更新中) 实现语言:C/C++:      欢迎各位看官交流讨论.指导题解错误:或者分享更快的方法!! 题目链接:https://pintia.cn/ ...

  5. coci2018 题解

    plahte 给定一些矩形和一些有颜色的点,求每个矩形上有多少种颜色的点,保证矩形只有包含和不相交两种关系,规模 \(10^5\). 把每个矩形看成一个点,用扫描线建出森林,同时也顺便处理点. 然后做 ...

  6. 【JZOJ6229】【20190621】san

    题目 \(n\)个点\(m\)条边的有向图,每个点有点权 你可以选择拓扑序的一个区间的 最大化点权和 $n \le 50  , m \le \frac{n*(n-1)}{2} , 0 \le |a_i ...

  7. 2016 Multi-University Training Contest 4 部分题解

    1001,官方题解是直接dp,首先dp[i]表示到i位置的种类数,它首先应该等于dp[i-1],(假设m是B串的长度)同时,如果(i-m+1)这个位置开始到i这个位置的这一串是和B串相同的,那么dp[ ...

  8. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  9. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

随机推荐

  1. JavaScript数据类型BigInt实践之id数值太大,导致前后端交互异常

    项目开发中前后端数据交互常会使用id作为主键索引,通常id数值都不大,使用number类型就可以表示处理,但对于一些分布式id或其他情况,id数值太大且超过了JS的最大处理数(Math.pow(2,  ...

  2. GDOI 2021 普及组溺水记

    Day 1 T1 一看样例:答案不就是 \(\dfrac{\max_{i=1}^n a_i +1}{2}\) 吗? 于是自信打上,拍都不拍.然后就,,对了? 插曲:自己出了一个极端数据,发现 scan ...

  3. 【Golang】创建有配置参数的结构体时,可选参数应该怎么传?

    写在前面的话 Golang中构建结构体的时候,需要通过可选参数方式创建,我们怎么样设计一个灵活的API来初始化结构体呢. 让我们通过如下的代码片段,一步一步说明基于可选参数模式的灵活 API 怎么设计 ...

  4. html关键字大全

    html标签属性大全 html标签属性大全从网上搜集整理的常用html标签,供朋友们交流学习html用. html标签<marquee> <marquee>...</ma ...

  5. redis相关知识点

    redis 的相关知识点 启动 启动代码 redis-cli -a 密码 通用命令 expire: 设置有效期 expire name 10 key key * 相关数据类型 String set:添 ...

  6. 基于.NET6的开源工业物联网网关

    什么是工业物联网网关 工业物联网网关(IIoTGateway)是一种硬件设备或软件程序,作为本地设备(如PLC.扫码枪.机器人.数控机床.非标上位机等)与云端系统(如物联网平台.SCADA系统.MES ...

  7. 3D还原货拉拉女孩身亡真相,这一环值得反思!

    货拉拉女孩跳车身亡的消息,让人惋惜又震惊.司机多次偏离原始路线,女孩最终选择跳车,结果不幸身亡. 货拉拉女孩跳车真相被3D还原 有人质疑平台监管不力,造成如此惨剧,有人吐槽企业压榨员工,司机绕路是不得 ...

  8. SAP Web Dynpro-监视应用程序

    您可以使用ABAP监视器来监视Web Dynpro应用程序. 存储有关Web Dynpro应用程序的信息. 您可以使用T代码-RZ20查看此信息. 您可以在Web Dynpro ABAP监视器中查看以 ...

  9. zabbix通过invoke调用监控服务可用性

    1. 通过脚本判断线上服务是否可用 telnet 127.0.0.1 端口 #线上调用的是使用的dubbo端口 通过invoke 抓取返回的code值,脚本如下 #返回code:0则视为正常,返回其他 ...

  10. 测试右移:线上质量监控 ELK 实战

    目录 [测试右移]介绍 ELK Stack 介绍 ELK 监控体系搭建 ES & Kibana 搭建 Nginx 日志自动采集 Nginx Agent 安装 Nginx 服务器 数据分析 Lo ...