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】组合子逻辑,贪心+堆相关推荐

  1. [优先队列][堆] Luogu P4505 组合子逻辑

    题目描述 组合子逻辑是 Moses Schönfinkel 和 Haskell Curry 发明的一种符号系统,用于消除数理逻辑中对于变量的需要.本题考察一种与真实世界的组合子演算略有差别的组合子系统 ...

  2. 【逻辑与计算理论】λ演算、组合子逻辑的历史背景

    [逻辑与计算理论]λ 演算.组合子逻辑的历史背景 函数--是横跨数学.逻辑和计算的最基础概念,也是从逻辑走向计算的基本工具.想象一下,如果一个逻辑系统不再以命题.谓词.量词.变量为基本单位而把函数作为 ...

  3. 【逻辑与计算理论】λ演算与组合子逻辑概念简介

    [逻辑与计算理论]λ演算与组合子逻辑概念简介 一.λ演算基本概念入门 1. 通过我们前面的讨论可知:有两种函数,一种是一阶谓词逻辑中存在着的特殊函数--真值函数:另一类则是我们所熟悉的数学函数.通过学 ...

  4. 【逻辑与计算理论】组合子逻辑与 Y 组合子

    为什么是Y? 在前面的几个帖子里,我已经建立了如何把lambda演算变成一个有用的系统的点点滴滴. 我们已经有了数字,布尔值和选择运算符.我们唯一欠缺的是重复. 这个有点棘手.lambda演算使用递归 ...

  5. 函数式编程中的组合子

    函数式编程是一个比较大的话题,里面的知识体系非常的丰富,在这里我并不想讲的特别的详细.为了应对实际中的应用,我们讲一下函数式编程中最为实用的应用方式--组合子.组合子本身是一种高阶函数,他的特点就是将 ...

  6. 关于python中Y组合子的问题讨论

    关于python中Y组合子的问题讨论 by Wenze Jin 在 The Structure and Interpretation of Computer Programs 这门课的hw03-Rec ...

  7. POJ - 1456 贪心 堆常用操作 注意细节

    题意:给定n个商品的deadline和profit,求每天卖一件的情况下的最大获利 显然是一道贪心 按deadline从小到大排序好,动态维护小根(profit)堆的大小<=当前deadline ...

  8. AT3957-[AGC023F]01 on Tree【贪心,堆】

    正题 题目链接:https://www.luogu.com.cn/problem/AT3957 题目大意 nnn个节点的一棵树,每个节点有0/10/10/1.每次删除一个根节点,然后把该节点的值填入序 ...

  9. P3620-[APIO/CTSC2007]数据备份【贪心,堆,链表】

    正题 题目链接:https://www.luogu.com.cn/problem/P3620 题目大意 一条线上有nnn个位置,选出kkk对使得它们的距离差之和最小. 解题思路 因为一定是连接相邻的最 ...

最新文章

  1. access突然需要登录_早知道早好,微信小程序登录开发需要注意的事项
  2. angularJS中directive与controller之间的通信
  3. 如何強迫 .Net 應用程式輸出英文的例外訊息
  4. Unity游戏开发技巧集锦2.1.3实现效果
  5. UE4.18预览第一版发布,共享XR引擎层降低硬件支持难度
  6. 这段时间没有好好的总结了
  7. CTFshow 信息收集 web10
  8. MongoDB同步到Oracle,MongoToOracleMongoDB数据库迁移工具
  9. Android(四)——View和ViewGroup
  10. 今晚直播 | 微软亚洲研究院徐毅恒:预训练时代下的文档智能
  11. iOS开发-iPad侧边栏Tab选项卡切换
  12. python2打开文件_关于python:何时以二进制模式打开文件(b)?
  13. java异常处理 ppt_Java异常处理、多线程ppt课件
  14. 你有没有想过,在SpringBoot集成下,Mybatis的mapper代理对象究竟是如何生成的?...
  15. 浅析GDAL库C#版本支持中文路径问题
  16. Pycharm在创建py文件时, 如何自动添加文件头注释?
  17. c语言图形时钟编程,c语言程序+图形编程——打造简易的时钟
  18. U盘启动CDLinux制作方法
  19. 【懒懒的Tensorflow学习笔记一之快速入门】
  20. 永洪科技怎么样_【永洪科技工资|永洪科技待遇怎么样】-看准网

热门文章

  1. 解析:区块链的本质是伴随信息社会产生的一种新型生产关系
  2. java hashmap putall_Java ConcurrentHashMap.putAll方法代码示例
  3. python tkinter的基础用法
  4. php border-style,border-style
  5. c++ 模糊搜索 正则表达式_c++使用正则表达式提取关键字的方法
  6. java可以连接php吗_java - 需要PHP或Java代码才能使用多个Internet连接
  7. php 字符串转 buffer,这个字符串转换类用处大吗?-PHP教程,PHP应用
  8. java 数据验证_Java 数据验证
  9. cmake字符串转数组_JS 数组中你或许不知道的操作
  10. 7的整除特征 三位一截_「每周一课」数字和除号握手言和,来攻克整除问题