【BZOJ3152】组合子逻辑,贪心+堆
3152: [Ctsc2013]组合子逻辑
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 176 Solved: 107
[Submit][Status][Discuss]
Description
组合子逻辑是Moses Schönfinkel和Haskell Curry发明的一种符号系统,用于消除数理逻辑中对于变量的需要。本题考察一种与真实世界的组合子演算略有差别的组合子系统。 一个组合子项是下列形式之一:
P
(E1 E2)
其中P表示一个基本函数,E1以及E2表示一个组合子项(可以相同)。不满足以上形式的表达式均非组合子项。
我们将一个组合子项E的参数个数np(E)如下:
np(P) = 基本函数P的参数个数;
np((E1 E2)) = np(E1) - 1。
本题中,我们用一个正整数同时表示一个基本函数,以及该基本函数的参数个数。 对于一个组合子项E,如果它和它包含的所有组合子项的参数个数np均为正整数,那么我们称这个E为范式。
我们经常组合子项简化表示:如果一个组合子项E含有连续子序列(… ((E1 E2) E3) … En) (其中n ≥ 3),其中Ek表示组合子项(可以是简化表示的),那么将该部分替换为(E1 E2 E3 … En),其他部分不变,得到表达式E的一个简化表示。一个组合子项可以被简化表示多次。 给定一个基本函数序列,问至少需要添加多少对括号,才能使得该表达式成为一个范式的简化表示(即满足范式的性质);如果无论如何怎样添加括号,均不能得到范式的简化表示,输出-1。
Input
第一行包含一个正整数T,表示有T次询问。 接下来2T行。 第2k行有一个正整数nk,表示第k次询问的序列中基本函数的个数。 第2k + 1行有nk个正整数,其中第i个整数表示序列中第i个基本函数。
Output
输出T行,每行一个整数,表示对应询问的输出结果。
Sample Input
2
5
3 2 1 3 2
5
1 1 1 1 1
Sample Output
3
-1
HINT
【样例说明】
第一次询问:一个最优方案是(3 (2 1) (3 2))。可以证明不存在添加括号对数更少的方案。
第二次询问:容易证明不存在合法方案。
令TN表示输入中所有nk的和。TN≤2000000
写在前面:怎么感觉最近不在状态了?又到了退役的季节?
思路:读题读了半个小时才明白题意= =
主要是把原序列a逐渐缩点最终形成一个不上升序列,从头开始往下划拉(初值k为a[1]),如果到第i个点时k>1(即可以拓展)就k–,如果k=1那么一定要在已经拓展的点x中再拓展出一个子序列(且易知这个子序列一定能被k拓展),这样k=k+x-1(因为k可以不必一个个扩展这个子序列中的点,而是直接扩展整个子序列,消耗的价值由子序列的长度len减为1,而len就等于这个序列中最大的点,即最左边的点的权值-1,就是大于1的点可以帮助拓展),同时ans++。因此我们知道肯定先用之前读过的最大的点(max{a[2],a[3]…a[i-1]})来扩展肯定是最优的且能扩展的序列max长度一定是它的权值-1,所以加一个堆来存放之前读进来的a[i]就可以了,当(空堆||最大值为1)&&k<=1时,输出-1。
还有一点就是n=1时要注意,如果读入的数不用括号就可以(输出0)
#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
#include<algorithm>
using namespace std;
int t,n,a[2000010];
int in()
{int t=0;char ch=getchar();while (ch>'9'||ch<'0') ch=getchar();while (ch>='0'&&ch<='9') t=t*10+ch-'0',ch=getchar();return t;
}
void solve()
{int ans=1;n=in();if(n==1) {if (in())printf("0\n");else printf("-1\n");return;} priority_queue <int> team;for (int i=1;i<=n;i++) a[i]=in();int k=a[1];for (int i=2;i<=n;i++){while (k<=1) if (team.empty()||team.top()==1){printf("-1\n");return;}else ans++,k+=team.top()-1,team.pop();k--;team.push(a[i]);}printf("%d\n",ans);
}
main()
{t=in();while (t--) solve();
}
【BZOJ3152】组合子逻辑,贪心+堆相关推荐
- [优先队列][堆] Luogu P4505 组合子逻辑
题目描述 组合子逻辑是 Moses Schönfinkel 和 Haskell Curry 发明的一种符号系统,用于消除数理逻辑中对于变量的需要.本题考察一种与真实世界的组合子演算略有差别的组合子系统 ...
- 【逻辑与计算理论】λ演算、组合子逻辑的历史背景
[逻辑与计算理论]λ 演算.组合子逻辑的历史背景 函数--是横跨数学.逻辑和计算的最基础概念,也是从逻辑走向计算的基本工具.想象一下,如果一个逻辑系统不再以命题.谓词.量词.变量为基本单位而把函数作为 ...
- 【逻辑与计算理论】λ演算与组合子逻辑概念简介
[逻辑与计算理论]λ演算与组合子逻辑概念简介 一.λ演算基本概念入门 1. 通过我们前面的讨论可知:有两种函数,一种是一阶谓词逻辑中存在着的特殊函数--真值函数:另一类则是我们所熟悉的数学函数.通过学 ...
- 【逻辑与计算理论】组合子逻辑与 Y 组合子
为什么是Y? 在前面的几个帖子里,我已经建立了如何把lambda演算变成一个有用的系统的点点滴滴. 我们已经有了数字,布尔值和选择运算符.我们唯一欠缺的是重复. 这个有点棘手.lambda演算使用递归 ...
- 函数式编程中的组合子
函数式编程是一个比较大的话题,里面的知识体系非常的丰富,在这里我并不想讲的特别的详细.为了应对实际中的应用,我们讲一下函数式编程中最为实用的应用方式--组合子.组合子本身是一种高阶函数,他的特点就是将 ...
- 关于python中Y组合子的问题讨论
关于python中Y组合子的问题讨论 by Wenze Jin 在 The Structure and Interpretation of Computer Programs 这门课的hw03-Rec ...
- POJ - 1456 贪心 堆常用操作 注意细节
题意:给定n个商品的deadline和profit,求每天卖一件的情况下的最大获利 显然是一道贪心 按deadline从小到大排序好,动态维护小根(profit)堆的大小<=当前deadline ...
- AT3957-[AGC023F]01 on Tree【贪心,堆】
正题 题目链接:https://www.luogu.com.cn/problem/AT3957 题目大意 nnn个节点的一棵树,每个节点有0/10/10/1.每次删除一个根节点,然后把该节点的值填入序 ...
- P3620-[APIO/CTSC2007]数据备份【贪心,堆,链表】
正题 题目链接:https://www.luogu.com.cn/problem/P3620 题目大意 一条线上有nnn个位置,选出kkk对使得它们的距离差之和最小. 解题思路 因为一定是连接相邻的最 ...
最新文章
- access突然需要登录_早知道早好,微信小程序登录开发需要注意的事项
- angularJS中directive与controller之间的通信
- 如何強迫 .Net 應用程式輸出英文的例外訊息
- Unity游戏开发技巧集锦2.1.3实现效果
- UE4.18预览第一版发布,共享XR引擎层降低硬件支持难度
- 这段时间没有好好的总结了
- CTFshow 信息收集 web10
- MongoDB同步到Oracle,MongoToOracleMongoDB数据库迁移工具
- Android(四)——View和ViewGroup
- 今晚直播 | 微软亚洲研究院徐毅恒:预训练时代下的文档智能
- iOS开发-iPad侧边栏Tab选项卡切换
- python2打开文件_关于python:何时以二进制模式打开文件(b)?
- java异常处理 ppt_Java异常处理、多线程ppt课件
- 你有没有想过,在SpringBoot集成下,Mybatis的mapper代理对象究竟是如何生成的?...
- 浅析GDAL库C#版本支持中文路径问题
- Pycharm在创建py文件时, 如何自动添加文件头注释?
- c语言图形时钟编程,c语言程序+图形编程——打造简易的时钟
- U盘启动CDLinux制作方法
- 【懒懒的Tensorflow学习笔记一之快速入门】
- 永洪科技怎么样_【永洪科技工资|永洪科技待遇怎么样】-看准网
热门文章
- 解析:区块链的本质是伴随信息社会产生的一种新型生产关系
- java hashmap putall_Java ConcurrentHashMap.putAll方法代码示例
- python tkinter的基础用法
- php border-style,border-style
- c++ 模糊搜索 正则表达式_c++使用正则表达式提取关键字的方法
- java可以连接php吗_java - 需要PHP或Java代码才能使用多个Internet连接
- php 字符串转 buffer,这个字符串转换类用处大吗?-PHP教程,PHP应用
- java 数据验证_Java 数据验证
- cmake字符串转数组_JS 数组中你或许不知道的操作
- 7的整除特征 三位一截_「每周一课」数字和除号握手言和,来攻克整除问题