[BZOJ 3152] 组合子逻辑
Link:
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; }