zoukankan      html  css  js  c++  java
  • P4505 [CTSC2013]组合子逻辑 贪心+优先队列

    题意:

    给定一个长度为n序列,可以给序列任意两数(可以不相邻)外层加上一对括号,要求每对括号内元素个数不能超过第一个元素大小,求最少能加几层括号包含所有数

    范围&性质:\(1\le n\le 2*10^6\)

    分析:

    贪心的想,肯定越大的数能包含的数就越多,且要包含所有的数,那么至少在第一个数前面加上一个括号,之后不能添加时,就从已经在括号内的数中选择最大的一个数继续添加括号,接管原有的一部分,让最外层继续扩展,可以通过优先队列实现

    代码:

    #include<bits/stdc++.h>
    
    using namespace std;
    
    namespace zzc
    {
    	const int maxn = 2e6+5;
    	int t,ans;
    	int n,a[maxn]; 
    	priority_queue<int> q;
    	
    	void work()
    	{
    		scanf("%d",&t);
    		while(t--)
    		{
    			int x;
    			scanf("%d",&n);
    			if (n==1)
    			{
    				scanf("%d",&x);
    				if(x==0) printf("-1\n");
    				else printf("0\n");
    			} 
    			else
    			{
    				for (int i=1; i<=n; i++)
    				{
    					scanf("%d",&a[i]);
    				} 
    				int tmp=a[1]-1;
    				ans=1;
    				while (!q.empty()) q.pop();
    				for (int i=2; i<=n; i++)
    				{
    					if (tmp) tmp--; 
    					else
    					{
    						if(q.empty()||q.top()<=1)
    				    	{ 
    						   	ans=-1; 
    						   	break; 
    						}
    						ans++;
    						tmp=q.top()-2;
    						q.pop();
    					}
    					q.push(a[i]);
    				}
    				printf("%d\n",ans);
    			}
    		}
    	}
    
    }
    
    int main()
    {
    	zzc::work();
    	return 0;
    }
    
  • 相关阅读:
    原始字符串
    .Net Core 常见错误解决记录
    P1010 幂次方 P1022 计算器的改良
    P1036 选数
    广度优先遍历
    P4327 彼得潘框架
    链表
    标准库与标准模板库
    信息学竞赛打表犯规吗?
    对拍程序
  • 原文地址:https://www.cnblogs.com/youth518/p/13667373.html
Copyright © 2011-2022 走看看