UVALive - 7637 E - Balanced String(构造)

原题链接

题意:给出一个打乱顺序的序列,问是否能构造出一个括号匹配的字符串。每个数字为此前读取到的左括号数减去右括号数。

分析:有左括号开始构造,不够的话就找右括号。注意特殊情况待处理。详情看代码

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdlib>
#include<climits>
#include<ctype.h>
#include<set>
#include<map>
#define pi acos(-1.0)
#define mem(a) memset(a,0,sizeof(a))
#define mems(a,b) memset((a),(b),sizeof(a))
#define ll long long
#define ull unsigned long long
//#define LOCAL
#define ls root<<1
#define rs root<<1|1
#define Ls root<<1,l,mid
#define Rs root<<1|1,mid+1,r
using namespace std;
const int maxn=1e5+10;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
map<int,int>mp;
int a[maxn];
int main()
{
    int t;
    scanf("%d",&t);
    int kase=0;
    while(t--){
        int n;
        scanf("%d",&n);
        mp.clear();
        for(int i=0;i<n;i++) scanf("%d",&a[i]),mp[a[i]]++;
        printf("Case %d: ",++kase);
        if((n&1)&&!mp.count(1)){
            puts("invalid");
            continue;
        }
        mp[1]--;
        int pos=1,flag=0;
        for(int i=1;i<n&&!flag;i++){
            if(mp[pos+1]&&mp.count(pos+1)){
                pos++;
                mp[pos]--;
            }else if(mp[pos-1]&&mp.count(pos-1)){
                pos--;
                mp[pos]--;
            }
            else flag=1;
        }
        if(flag&&pos){
            puts("invalid");
            continue;
        }
        mp.clear();
        for(int i=0;i<n;i++) mp[a[i]]++;
        printf("(");
        pos=1;
        for(int i=1;i<n;i++){
            if(mp[pos+1]&&mp.count(pos+1)){
                printf("(");
                pos++;
                mp[pos]--;
            }else if(mp[pos-1]&&mp.count(pos-1)){
                pos--;
                mp[pos]--;
                printf(")");
            }
        }
        puts("");
    }
    return 0;
}
时间: 2024-10-27 01:28:44

UVALive - 7637 E - Balanced String(构造)的相关文章

UVaLive 7637 Balanced String (构造)

题意:给定一个括号的序列,原先的序列是碰到左括号加1,碰到右括号减1,然后把序列打乱,让你找出字典序最小的一个答案. 析:直接从第一个括号判断就好了,优先判断左括号,如果不行就加右括号. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cma

C++ string 构造的陷阱

先看代码 #include<iostream> #include<string> using namespace std; int main(int argc, char **argv) { string s = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz" + 'A'; cout<<s<<endl; return 0; }

uva live 7637 Balanced String (贪心)

题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5659 题意: 你有一个只包含"(" 和 ")" 的串,每一个位置有个数值,这个数值是当前的左括号-右括号的值. 例:()() 数值就是1010. 给你一个打乱了的数值,要你构造出字典序最小的字符串. 题解: 因为左括号比右括号

UVaLive 6588 &amp;&amp; Gym 100299I (贪心+构造)

题意:给定一个序列,让你经过不超过9的6次方次操作,变成一个有序的,操作只有在一个连续区间,交换前一半和后一半. 析:这是一个构造题,我们可以对第 i 个位置找 i 在哪,假设 i  在pos 位置,那么如果 (pos-i)*2+i-1 <= n,那么可以操作一次换过来, 如果不行再换一种,如果他们之间元素是偶数,那么交换 i - pos,如果是奇数,交换 i - pos+1,然后再经过一次就可以换到指定位置. 代码如下: #pragma comment(linker, "/STACK:1

hdu 4850 Wow! Such String! 构造 欧拉回路

Wow! Such String! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 934    Accepted Submission(s): 318 Special Judge Problem Description Recently, doge starts to get interested in a strange probl

codeforces 623A. Graph and String 构造

题目链接 给出一个图, 每个节点只有三种情况, a,b, c. a能和a, b连边, b能和a, b, c,连边, c能和b, c连边, 且无重边以及自环.给出初始的连边情况, 判断这个图是否满足条件. 由题意可以推出来b必然和其他的n-1个点都有连边, 所以初始将度数为n-1的点全都编号为b. 然后任选一个与b相连且无编号的点, 编号为1. 然后所有与1无连边的点都是3. 然后O(n^2)检查一下是否合理. #include <iostream> #include <vector>

hdu 4850 Wow! Such String! 构造 或 欧拉路径并改写成非递归版本

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4850 跟这道题也算是苦大仇深了... 题意:构造一个由26个小写字母组成的.无长度为4的重复子串的字符串(要求出能构造出的最大长度) 符合要求的长度为4的字符串有4^26个 容易猜最大长度是:4^26+3 = 456979 比赛的时候想法是要让各个字母出现得尽量“均匀” 用了一个cnt数组记录26个字母出现的次数 每次都选择出现次数最小的.不与前面重复的字母加上去 然而稍微写得有点歪,最后构造出了长

CF708B Recover the String 构造

For each string s consisting of characters '0' and '1' one can define four integers a00, a01, a10 and a11, where axy is the number of subsequences of length 2 of the string s equal to the sequence {x,?y}. In these problem you are given four integers

1221. Split a String in Balanced Strings

Balanced strings are those who have equal quantity of 'L' and 'R' characters. Given a balanced string s split it in the maximum amount of balanced strings. Return the maximum amount of splitted balanced strings. Example 1: Input: s = "RLRRLLRLRL"