[BZOJ 3152] 组合子逻辑

Link:

BZOJ 3152 传送门

Solution:

喜闻乐见,gyz出的语文题,题意要看半小时

 

题意:使用最少的括号将序列分割,对于每个括号中的序列,设最左边的数为$num$,序列中元素个数为$cnt$,

要保证:$num>=cnt$(括号括起来后算作一个元素)。一开始一个括号包含$[1,n]$。

 

由于一开始有一个括号包含$[1,n]$,

从头贪心即可,维护还能扩展的个数以及当前最大值

Note:注意对$n=1$的特殊处理

Code:

#include <bits/stdc++.h>

using namespace std;

inline int read()
{
    char ch;int num,f=0;
    while(!isdigit(ch=getchar())) f|=(ch=='-');
    num=ch-'0';
    while(isdigit(ch=getchar())) num=num*10+ch-'0';
    return f?-num:num;
}

int T,n,x,dat[2000005];

int main()
{
    T=read();
    while(T--)
    {
        n=read();priority_queue<int> que;
        if(n==1){puts((read())?"0":"-1");continue;}
        for(int i=1;i<=n;i++) dat[i]=read();
        
        int k=dat[1]-1,res=1;
        for(int i=2;i<=n;i++)
        {
            if(k){k--;que.push(dat[i]);continue;}
            
            if(que.empty() || que.top()<2){res=-1;break;}
            res++;k=que.top()-2;que.pop();que.push(dat[i]);
        }
        printf("%d\n",res);
    }
    return 0;
}
posted @ 2018-06-03 22:40  NewErA  阅读(252)  评论(0编辑  收藏  举报